垃圾收集
在某种程度上,对象会在内存中一个挨一个的放置,这样就很容易指向下一个空闲单元的堆指针,来确定下一个对象的位置。在堆上添加跟对对象是时,也容易调整,但这比较复杂,因为基于堆的生存期与引用他们的基于堆栈的变量的作用域不匹配。
在垃圾收集器运行时,会在堆中删除不在引用的所有对象。在完成删除动作后,堆会立即把对象分散开来,与已经释放的内存混合在一起。如下图:

如果托管的堆也是这样,在其上给新对象分配内存就成了一个很难处理的过程。运行库必须搜索整个堆,才能找到足够大的内存块来存储新的对象。但是垃圾收集器不会让堆处于这种状态。只要它释放了能释放的对象,就会把其他对象移动到堆的顶部再次形成一个连续的内存块。因此堆可以继续像堆栈那样确定在什么地方存储新的对象。当然在移动对象时这些对象所有的应用需要用正确的地址来更新,但垃圾收集器也会处理更新的问题。
垃圾收集器器的这个压缩操作时托管堆与为托管的旧堆的区别所在 。使用托管堆,就只需要读取堆指针即可,而不是搜索链接地址的列表,来查找一个地方放置新数据。因此在.NET下实例化对象要快的多。有趣的是访问它也比较快,因为对象会压缩到堆上相同的内存区域,这样需要交互的页面较少。Microsoft相信,尽管垃圾收集器需要做一些工作,压缩堆,修改它移动的对象的所有应用,致使性能降低,但这些性能会得到弥补。
浙公网安备 33010602011771号