高性能ASP.NET站点构建之托管资源优化

转载cnn2371112011-02-26 11:42:36评论(0)51人阅读

前言:本章主要详细的讲述如何因内存问题而导致的性能问题,很多的时候都是深入.NET内核进行分析,然后给出解决方案,同时,本系列的其他文章,也争取做到:深入浅出。

本篇是为后面的做个铺垫,而且比较的精彩。只有真正的理解了本篇,后面才可以顺利的走下去。

本篇的议题如下:

内存问题概述(前篇)

托管资源优化(前篇)

对象的生命周期(前篇)

对象的”代“(前篇)

大对象堆(LOH) (前篇)

CLR计数器的使用(前篇)

非托管资源优化

Session会话的优化

内存问题概述

和CPU一样,内存也是一个直接影响服务端性能的重要的硬件资源。

一般来说,如果服务端内存不足,从导致以下两个问题产生:

1. 导致服务端把一些原本要写到内存中的数据,写到硬盘上面。这样不仅仅加大了CPU和磁盘的I/O操作,同时也延长了读取这些数据的时间。

2. 阻止了一些缓存策略的使用。

对于内存不足,一直最快最直接的方式就是去买内存条加在服务器上面。但是这样存在一个隐患的问题就是:如果加了新的内存之后,服务端又面临内存不足的问题,我们不可能无止境的加内存条,那么我们就必须从站点本身来解决这个问题,例如从服务端的配置,对站点的代码进行分析,优化。

托管资源优化

对于托管资源,相信大家并不陌生了,简单的说就是:在C#的托管堆上面创建的资源,或者说通过new产生的对象。

在深入讲解之前,我们首先来看看”对象的生命周期”

对象的生命周期

当我们用new关键字创建了一个对象的时候,这个对象就被分配到CRL托管堆上面。这个托管堆是在内存中的。而且这个分配对象空间的速度是非常的快的,因为每次都是在托管堆的最后面划出一定的空间来给这个对象,不用去堆上面需找合适大小的空间。

如果当托管堆准备为一个对象分配空间的时候,发现托管堆上面的空间太小了,不足以分配给这个新的对象,那么CLR就开始运行垃圾回收机制了。我们知道:垃圾回收机制会把那些在托管堆上面没有了引用指向的那些对象都清理掉,同时也会把托管堆上面现存的对象进行压缩。

但是有一点需要清楚:如果此时进行了垃圾回收的时候,清除了一些没有用的对象,但是只有在下一次来回收进行的时候,上次垃圾回收清除的对象才真正的从内存中消除(此时,还有一些“对象复苏“等话题就不在赘述)。

下面就来讲述一些垃圾回收的话题。

对象的“代”

在CLR进行垃圾回收的时候,垃圾回收器回去托管堆上面去检查对象是否可以被回收,这个检查过程是非常消耗资源的。为了避免每次垃圾回收都要便利托管堆上面的所有对象,CLR给把托管堆上面的对象用”代”来划分,例如,第一代,第二代。然后每次便利扫描托管堆的时候,就去扫描某一个”代”中的对象,这样性能就好点。

在托管堆上面,可以把对象分为三个”代”:0代,1代,2代,仅此这三个代。每个对象都是从0代开始的。一个对象每经历一次垃圾回收,并且这个对象还在使用中,那么这个对象的“代“就会增加1代。例如,如果在0代的对象,经历了一次垃圾回收之后,他的代就是1代,如果是1代的对象,最后就会变为2代。如果对象本身已经是2代了,不管经历多少次垃圾回收(如果对象一直在使用),那么这个对象还是2代。

在CLR垃圾回收中有句话要记得:” ’代’数越大,被回收的可能性就越小”。而且一些性能优化就是根据这个进行的。

每次CLR在进行垃圾回收的时候,都会优先的去扫描第0代的对象,所以,一些新的,临时使用的对象可以被立刻的清除。相比而言,垃圾回收器扫描第1代对象的频率就没有第0代强,扫描第2代对象的频率就更低了。所以说:对象存活的时间越长,就越难被回收,而且一直占据CLR的内存资源。

还有有点需要注意的就是:如果CLR决定要扫描了第1代了,同时也用扫描第0代的对象,同时如果,CLR扫描第2代对象,那么第0代,第1代对象都会被扫描。

所以,从这里可以得出:我们尽量避免把原本需要立刻回收的的对象变为长期存活的对象。通俗点说就是:如果一个对象本来已经存活在0代的,然后用完就回收的,我们不要让这个对象一直存活到第1代,甚至第2代。在编程上面基本就是这样的实现思路:尽可能晚的实例化对象,尽可能早的释放对象。

大对象堆(Large Objecet Heap)

我们之前讲述了”堆”的一些话题,CLR除了上面的一般的堆(一般的new对象分配空间的那个堆),CLR中还存在另外的一个堆:专门用来放置那些大于了85k的对象的堆,大对象堆。

如果new一个对象的时候,这个对象的大小超过了85k,那么CLR就会把这个对象放在LOH上面。如果此时LOH的空间不足了,那么CLR就会启动垃圾回收器去扫描LOH堆和那个一般堆上面的第2代对象,我们之前说过,如果扫描第2代对象,就同时扫描第1代,第0代,那么实际相当于扫描了整个托管堆,性能影响可想而知。

而且不想之前那个一般堆,在LOH上面的对象被垃圾回收器回收之后,上面的大对象是不会被压缩的,那么LOH这个堆上面就可能存在一些”空间碎片”,然后分配新的大对象的时候,就要找空间,甚至进行碎片的整理,大家可以联想一下我们电脑的磁盘碎片整理。

原文链接:http://www.cnblogs.com/yanyangtian/archive/2011/02/17/1956768.html

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

高性能ASP.NET站点构建之托管资源优化相关推荐

  1. 高性能ASP.NET站点构建之简单的优化措施

    部署优化 我们都知道,不同的部署方式对站点的性能是有影响的,可能有些朋友已经知道了这点,不管怎样,我们这里还是详细系统的讲述一下这个问题,熟悉的朋友权当回顾J. Release方式编译项目 如果我们的 ...

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

    构建高性能ASP.NET站点 第七章 如何解决内存的问题(后篇)-托管资源优化-监常用优化措施   前言:有段时间没有写这个系列了,希望大家见谅,本篇主要将会介绍一些常用的CLR优化措施. 本篇的议题 ...

  3. 【原创】构建高性能ASP.NET站点 开篇

    原文:[原创]构建高性能ASP.NET站点 开篇 构建高性能ASP.NET站点 开篇 前言:有段时间没有写ASP.NET的东西了,心里总是觉得缺少了什么,毕竟自己对ASP.NET还是情有独钟的. 在本 ...

  4. 转:构建高性能ASP.NET站点 第五章—性能调优综述(中篇)

    构建高性能ASP.NET站点 第五章-性能调优综述(中篇) 前言:本篇主要讲述用一些简单的工具来分析一些与站点性能有关的数据,在上一篇文章中,我们讨论了一下性能调优的一般过程,本篇就开始介绍一些方法和 ...

  5. 构建高性能ASP.NET站点 第六章—性能瓶颈诊断与初步调优(下前篇)—简单的优化...

    构建高性能ASP.NET站点 第六章-性能瓶颈诊断与初步调优(下前篇)-简单的优化措施     前言:本篇给出一些在部署ASP.NET站点时采用的简单的优化措施.        本篇议题如下:     ...

  6. 【原创】构建高性能ASP.NET站点 第五章—性能调优综述(后篇)

    构建高性能ASP.NET站点 第五章-性能调优综述(后篇) 前言:本篇主要讲述如何根据一些简单的工具和简单的现象来粗布的定位站点的性能问题. 本章的议题如下: 性能调优的一般过程 利用分析工具分析页面 ...

  7. 构建高性能ASP.NET站点 开篇

    前言:有段时间没有写ASP.NET的东西了,心里总是觉得缺少了什么,毕竟自己对ASP.NET还是情有独钟的. 在本系列文章中,准备比较全面的讲述ASP.NET的性能的优化,从前台到后台,以后本列文也看 ...

  8. 建高性能ASP.NET站点 第五章—性能调优综述(中篇)

    构建高性能ASP.NET站点 第五章-性能调优综述(中篇) 前言:本篇主要讲述用一些简单的工具来分析一些与站点性能有关的数据,在上一篇文章中,我们讨论了一下性能调优的一般过程,本篇就开始介绍一些方法和 ...

  9. ASP.NET站点构建之减少不必要的请求

    服务端的要处理的请求越多,无疑服务端的压力也就越大,尤其是有些请求需要访问一些比较昂贵的资源,例如数据库,服务端的文件等.但是我们必须知道,在到达服务端的请求中,有些请求时我们希望的,例如网站的用户的 ...

最新文章

  1. JS+CSS点击弹出登陆框代码
  2. V神再为BCH发声!
  3. [物理学与PDEs]第2章习题参考解答
  4. MySQL高级 - insert优化
  5. C++ 学习之旅(2)——链接器Linker
  6. 前端学习(2664):vue3.0的todolist控制完成和未完成
  7. Spring Boot Actuator监控关闭
  8. 回家了,写博文继续!
  9. java corba_Java编写CORBA的一个简单例子(CORBA入门)
  10. Java处理Json数据
  11. HTML5期末大作业:我的家乡网站设计5
  12. jmeter连接mysql时jdbc下载
  13. 企业数据总线(ESB)和注册服务管理(dubbo)的区别
  14. AWS韩小勇为创业者详细解读云服务商如何为他们提供服务
  15. 安全的网络通道——网络准入之三层准入
  16. 抖音国际版Tiktok不能注册的解决方案长期有效2020.8
  17. [ZT]SAP ECC5.0 Working Log TO 2008.5.26
  18. linux代码布局,Linux内存布局(示例代码)
  19. 生物基础-多组学联合分析
  20. 一个相当有用的利器,提高检索匹配的效率!

热门文章

  1. python 帮助文档,撰写函数文档,并查看函数文档
  2. 【ES6】异步操作和async函数
  3. 图像拼接--A multiresolution spline with application to image mosaics
  4. java怎么加定时器_JAVA WEB程序中添加定时器
  5. 大红灯笼高高挂专业影评_浅谈《大红灯笼高高挂》
  6. centos8开启网络
  7. android 获取 第三方应用,​android PackageManager的使用如何获取第三方应用程序(包)的信息,求大神指点...
  8. python如何次传参给线程_python如何给线程中的函数传参?
  9. SaaS到底是什么,如何做?这份笔记讲明白了
  10. C语言中的输入输出函数