.Net Discovery系列-深入理解平台机制与性能影响(上)

  转眼间《.NET Discovery》系列文章已经推出1年了,本文为该系列的第10-13篇文章,在本文中将对以前所讲的.NET平台知识做一个小小的总结与机制分析,引出并重点介绍这些机制对程序性能的影响与改进建议。

  本文将分为四部分,分别讲述了:垃圾回收机制、即时编译机制、异常处理机制、字符串驻驻留机制的原理与性能改进建议。

  《.NET Discovery》系列的每篇文章撰写耗时都在2天以上,转载时麻烦著名作者Aicken(李鸣),并且未经作者同意,禁止一切商业用途!

  一.关于垃圾回收机制●

  机制分析垃圾收集器是.NET平台的一个特性,它自动回收托管堆上不再使用的对象,及时清理内存,这一切都是对开发人员透明的,当然你也可以手动把它召唤出来,它的本质就是跟踪所有被引用到的对象,整理对象不再被引用的对象,回收相应的内存。垃圾收集机制采用标记与清除(Mark Sweep)算法来完成上述任务,整个过程分为两步:

  Step 1.Mark-Sweep :从应用程序的root出发,利用相互引用关系,遍历其在Heap上动态分配的所有对象,指明需要回收的对象,标记出那些存活的对象,予以标记。

  Step 2.Compact: 对内存中存活的对象进行移动,修改它们的指针,使之在内存中连续,这样空闲的内存也就连续了,即完成了内存释放工作,也解决了内存碎片问题,这个过程也可以成为指针的压缩。垃圾收集器一般将托管堆中的对象分为3代,这可以通过调用GC.MaxGeneration得知,对象按照存在时间长短进行分代,最短的分在第0代,最长的分在第2代,第2代中的对象往往是比较大的,第二代空间被称作Large Object Heap,对于2代对象的回收,与第0、1代回收方式相比最大的不同在于,没有了指针移动的压缩过程。如下图,第一次GC时,左边第一列A-F表示内存中的对象,位于浅蓝色 区域,经过Mark后,ACDF标记为可用,Sweep过程清除了BE,Compact过程移动了ACDF,使之位于连续存储区域中;第二次使用绿色做标记;第三次GC使用蓝色表示标记;可以看出第三次GC过程没有了指针移动的压缩过程。

NET技术.Net Discovery系列-深入理解平台机制与性能影响(上),转载需保留来源!

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。