.Net的垃圾自动回收机制之一
.Net的垃圾自动回收机制之一
内存管理是软件开发过程中相当重要的一环。据调查,软件故障中大多数异常均是于内存管理相关,比如野指针,比如重复释放,再比如内存泄露等。
为提高软件开发效率,很多开发平台如.Net, Java 等提供了垃圾自动回收机制(GC),替开发人员管理内存。
那么这垃圾回收机(GC)是如何分配内存的?又是如何释放垃圾内存的?GC有内存碎片的问题吗?
在开始回答这些问题之前,我们先来看一下CLR堆的管理结构,CLR堆有两种工作模式:工作站模式与服务器模式。
从上图可以看出服务器模式与工作站模式最主要的区别在于服务器模式在每一个处理器上都单独部署了一个CLR堆。
每一个CLR堆由两部分组成,即小对象堆(Small Object Heap)与大对象堆(Large Object Heap), 而不管是 Small Object Heap 还是Large Object Heap 都是堆段组成, 其中Small Object Heap 第一个堆段被称作是临时段(Ephemeral Seg)
Large Object Heap 顾名思义,就是管理大对象的堆,超过85,000(Bytes)的对象在Large Object Heap上分配。
CLR堆为什么要如此设计?关键在于CLR堆在内存回收里有一个内存压缩整理动作,而对象的压缩整理耗时与对象大小有直接关系,所以CLR堆为减少GC的时间,设计了Large Object Heap, 也就是说Large Object Heap在垃圾回收过程中没有压缩整理过程。
通过SOS.dll的扩展命令eeHeap可以查看内存情况,
从上图可以看到,CLR 堆有一个Large Object Heap 范围在0313000~03135328
一个临时堆(02131000~02135ff4),该临时堆初分成了generation 0,generation 1,generation 2.
后面将会谈到CLR堆的generation 管理机制。 未完待续