构建高性能ASP.NET站点 第七章 如何解决内存的问题(后篇)—托管资源优化—监常用优化措施

简介:


构建高性能ASP.NET站点 第七章 如何解决内存的问题(后篇)—托管资源优化监常用优化措施

 
前言:有段时间没有写这个系列了,希望大家见谅,本篇主要将会介绍一些常用的CLR优化措施.
 
本篇的议题如下:
内存问题概述(前篇)
托管资源优化(前篇)
         对象的生命周期(前篇)
         对象的代“(前篇)
         大对象堆(LOH) (前篇)
         CLR计数器的使用         (中篇)
         CLR Profiler的使用(中篇)
         垃圾回收器的不同版本(中篇)
         对象使用注意事项(后篇)
         常用优化措施(后篇)
非托管资源优化
Session会话的优化  
 
对象使用注意事项
   在之前的内容,我们讲述了CLR的托管堆的相关知识,同时也讲述了CLR的垃圾回收机制,对于对象,言有一点要记住:尽可能晚的创对象。目的是使得对象的“代”尽可能的小,让没有必要生存很长时间的对象尽可能早的被回收。
 
   下面是对象使用的注意事项:
1.  不要过早的创建大对象,然后再很久之后才用,而是在要用的才创建,如下:
 
不要这样:
 
InBlock.gifLargeObject largeObject = new LargeObject(); 
InBlock.gif 
InBlock.gif// Long running database call ... 
InBlock.gif 
InBlock.giflargeObject.MyMethod(); 
InBlock.gif 
而要这样:
 
InBlock.gif// Long running database call ... 
InBlock.gif 
InBlock.gifLargeObject largeObject = new LargeObject(); 
InBlock.gif 
InBlock.giflargeObject.MyMethod(); 
InBlock.gif 
同样,这个原则也适用于消耗资源很多的对象,例如Transaction事务对象,要尽可能晚的打开事务,尽可能早的关闭事务。
 
2.  如果在.NET4 中,可以考虑使用Lazy<T>。它可以使得我们定义事先定义一个对象,知道需要的时候才实例化它。如下:
InBlock.gifLazy<ExpensiveObject> expensiveObject = new Lazy<ExpensiveObject>(); 
InBlock.gif 
通过以下语句在需要时,获取这个对象:
 
InBlock.gifexpensiveObject.Value; 
InBlock.gif 
 
3. 对于确定不再需要的对象,尽早的释放,将其引用设为null,如下:
InBlock.gifLargeObject largeObject =  new LargeObject(); 
InBlock.gif 
InBlock.gif // Create reference from long lived object to new large object 
InBlock.gif 
InBlock.giflongLivedObject.largeObject = largeObject; 
InBlock.gif 
InBlock.gif // Reference no longer needed 
InBlock.gif 
InBlock.giflongLivedObject.largeObject =  null
 
常用优化措施
1. 使用StringBuilder进行字符串拼接
不要这样:
 
InBlock.gif string s = ""; 
InBlock.gif 
InBlock.gif for ( int i = 0; i < stringArray.Length; i++) 
InBlock.gif
InBlock.gif 
InBlock.gif     s += stringArray[i]; 
InBlock.gif 
InBlock.gif
要这样:
InBlock.gifStringBuilder sb =  new StringBuilder(capacity); 
InBlock.gif 
InBlock.gif for ( int i = 0; i < stringArray.Length; i++) 
InBlock.gif
InBlock.gif 
InBlock.gifsb.Append(stringArray[i]); 
InBlock.gif 
InBlock.gif
InBlock.gif 
InBlock.gif string s = sb.ToString(); 
 
不要这样:
 
InBlock.gif // Concatenation results in new string object 
InBlock.gifsb.Append(stringArray[i] +  ","); 
InBlock.gif 
要这样:
 
InBlock.gifsb.Append(stringArray[i]); 
InBlock.gifsb.Append( ","); 
 
:
1.如果需要拼接的字符串超过了6个以上,那么就可以用StringBuilder,如果没有超过6个,那么可以直接将其拼接,两者区别不大。
2. 如果可以知道估算出字符串的长度,可以在使用StringBuilder拼接的时候,尽量的声明StringBuilder的容量,例如new StringBuilder(1000);因为如果不声明容量,StringBuilder的默认容量是16,如果字符串过长,那么CLR会重新为StringBuilder分配新的容量和内存,把原来的字符串copy过来,这样,原来的字符串保存空间就浪费,直到 CLR垃圾回收才释放。
2.使用Compare进行字符串的大小比较
比较字符串是否相等的时候,一般如下:
InBlock.gif if (s1.ToLower() == s2.ToLower()) 
InBlock.gif
InBlock.gif 
InBlock.gif
但是,这样会更好:
InBlock.gif if ( string.Compare(s1, s2,  true) == 0) 
InBlock.gif
InBlock.gif 
InBlock.gif
   因为在Compare方法比较的时候是一个字节一个字节的比较,这样会更快。
 
3.使用Response.Write来输出缓冲
ASP.NET中,采用Response.Write来讲数据发送到浏览器,
不要采用:
InBlock.gifResponse.Write(s1 + s2); 
要采用:
InBlock.gifResponse.Write(s1); 
InBlock.gifResponse.Write(s2); 
 
 


























本文转自yanyangtian51CTO博客,原文链接: http://blog.51cto.com/yanyangtian/518321  ,如需转载请自行联系原作者


 
 
相关文章
|
30天前
|
人工智能 关系型数据库 Serverless
Serverless 应用引擎常见问题之AI应用限制人为限制内存如何解决
Serverless 应用引擎(Serverless Application Engine, SAE)是一种完全托管的应用平台,它允许开发者无需管理服务器即可构建和部署应用。以下是Serverless 应用引擎使用过程中的一些常见问题及其答案的汇总:
29 3
|
1月前
|
运维 Kubernetes Java
nacos常见问题之nacos的内存太高如何解决
Nacos是阿里云开源的服务发现和配置管理平台,用于构建动态微服务应用架构;本汇总针对Nacos在实际应用中用户常遇到的问题进行了归纳和解答,旨在帮助开发者和运维人员高效解决使用Nacos时的各类疑难杂症。
|
2月前
|
弹性计算 网络安全 虚拟化
ECS快照问题之提取内存信息失败如何解决
阿里云ECS用户可以创建的一个虚拟机实例或硬盘的数据备份,用于数据恢复和克隆新实例;本合集将指导用户如何有效地创建和管理ECS快照,以及解决快照过程中可能遇到的问题,确保数据的安全性和可靠性。
|
27天前
|
监控 关系型数据库 数据库
OceanBase数据库常见问题之增加内存依旧报内存不足如何解决
OceanBase 是一款由阿里巴巴集团研发的企业级分布式关系型数据库,它具有高可用、高性能、可水平扩展等特点。以下是OceanBase 数据库使用过程中可能遇到的一些常见问题及其解答的汇总,以帮助用户更好地理解和使用这款数据库产品。
|
1月前
|
Java 关系型数据库 Nacos
Nacos常见问题之内存呈周期性波动如何解决
Nacos是一款易于使用的动态服务发现、配置管理和服务管理平台,针对不同版本可能出现的兼容性和功能问题,本汇总贴心整理了用户在使用Nacos时可能遇到的版本相关问题及答案,以便用户能够更顺畅地进行服务治理和配置管理。
49 0
|
3月前
|
人工智能 前端开发 Java
Serverless应用引擎问题之SAE内存接近占满如何解决
Serverless部署是指将应用程序部署到无服务器架构中,该架构允许开发者专注于代码而无需关心底层服务器的运行和维护;针对Serverless部署过程中可能遇到的挑战,本合集提供全面的指南和最佳实践,帮助开发者顺利实现应用的无服务器化部署。
146 1
|
开发框架 JSON 缓存
基于 Debain11 构建 asp.net core 6.x 的基础运行时镜像
此处我们基于 Debian11 的 Linux 发行版,实现目标是编写 Dockerfile 构建 asp.net core 6.x 框架的 runtime 基础镜像。在 Docker 容器化运行环境中,应用程序运行中存在异常情况,此时可以借助一些常用的基础工具方便排查,因此我们需要在 asp.net core 6.x runtime 基础镜像添加 linux 环境常用的...
289 1
基于 Debain11 构建 asp.net core 6.x 的基础运行时镜像
|
JSON 前端开发 JavaScript
WebSocket+Net二ty构建web聊天程序(二)
WebSocket+Net二ty构建web聊天程序(二)
151 0
|
弹性计算 运维 监控
如何解决 Linux 内核调测两大难题:内存被改与内存泄露
一直以来,内核内存调测领域一直持续存在着两大行业难题: "内存被改" 和 "内存泄漏"。内存问题行踪诡异、飘忽不定,在 Linux 内核的调测问题中,是最让开发者头疼的 bug 之一,因为内存问题往往发生故障的现场已经是第 N 现场了,尤其是在生产环境上出现,截止目前并没有一个很有效的方案能够进行精准的线上 debug,导致难以排查、耗时耗力。
452 0
如何解决 Linux 内核调测两大难题:内存被改与内存泄露
|
jenkins .NET Linux
Jenkins 构建自动化.NET C ore 发布镜像
Jenkins 构建自动化.NET C ore 发布镜像
261 0
Jenkins 构建自动化.NET C ore 发布镜像