当前位置:主页   - 电脑 - 程序设计 - C#
CLR探索系列:GC Heap架构及其实现(垃圾回收系列)
来源:网络   作者:   更新时间:2012-02-25
收藏此页】    【字号    】    【打印】    【关闭

  在CLR探索系列的研究DotNet下的垃圾回收器这几个博文里,就先说说GC Heap结构吧,至于垃圾回收的详析算法实现,以后再写了。在一个托管进程被创建以后,在托管进程的内存空间里面,包含了System Domain,Shared Domain,Default Domain,以及一系列的Heap,有Process的Heap,JIT Code Heap,GC Heap以及LOH。在DotNet的CLR的实现中,GC heap和LOH(Large Object Heap)是包含在一个类里面实现的。这就造成了在内存中,一个GC Heap后面紧跟着的就是LOH Heap。在实现的时候,一个gc_heap类里面包含了一个GC的结构类,以及一个LOH。

  一个GC Heap的结构大致如下:

CLR探索系列:GC Heap架构及其实现(垃圾回收系列)

  上面是一个GC Heap的大致结构。从上面到下面是从低地址到高地址。有的时候,需要找一个需要的存在了很久的Object的时候,并不是往高地址去寻找,也有可能存在于低地址区域,这个和每个Generation的大小的动态改变有关。    说到这里,就会提到一个非常有趣的概念,“策略”。这个是GC开发小组的开发人员在研究呢很久性能和用户的操作以及内存管理之间的平衡只会整出来的一个比较有趣的概念。在垃圾回收的过程中加入了“策略”。譬如一个Generation 0代占有256KB的内存大小,如果在实际的程序的运行过程中发现新对象的创建特别频繁,那么GC EE就会自动增加这个Generation 0的大小。    在说明一个GC Heap的结构的时候,先用windbg+sos来看看一个用户态运行的程序的GC Heap里面都有些啥:    0:003> !eeheap=======================================
Number of GC Heaps: 1
generation 0 starts at 0x00ca1018
generation 1 starts at 0x00ca
100c
generation 2 starts at 0x00ca1000
ephemeral segment allocation context: none
segment  begin allocated   size00161e00 790d5588 
790f
4b38 0x
0001f
5b0(128432)
00ca0000 00ca1000 00ca3ff4 0x00002ff4(12276)
Large object heap starts at 0x01ca1000segment  begin allocated   size
01ca0000 01ca1000 01ca3250 0x00002250(8784)
Total Size  0x
247f
4(149492)
------------------------------
GC Heap Size  0x
247f
4(149492)
=======================================

其它资源
来源声明

版权与免责声明
1、本站所发布的文章仅供技术交流参考,本站不主张将其做为决策的依据,浏览者可自愿选择采信与否,本站不对因采信这些信息所产生的任何问题负责。
2、本站部分文章来源于网络,其版权为原权利人所有。由于来源之故,有的文章未能获得作者姓名,署“未知”或“佚名”。对于这些文章,有知悉作者姓名的请告知本站,以便及时署名。如果作者要求删除,我们将予以删除。除此之外本站不再承担其它责任。
3、本站部分文章来源于本站原创,本站拥有所有权利。
4、如对本站发布的信息有异议,请联系我们,经本站确认后,将在三个工作日内做出修改或删除处理。
请参阅权责声明