.NET GC简单理解

对象实例化过程

  • 计算对象大小。
  • 添加对象指针和同步索引块。
  • 从内存指针处开始,分配对象内存。
  • 问题:内存不能无限制增长。

垃圾回收

  • 从应用程序实例出发,标记所有的引用对象
  • 将标记对象移动到低地址端,修正实例引用地址与内存指针。
  • 问题:全内存移动对象,垃圾回收性能不高。

分代回收

  • 将对象分代(0、1、2),对低代对象进行垃圾回收,幸存对象升级为高代对象。
  • 低代对象垃圾回收也无法满足时高代对象进行垃圾回收,若2代垃圾回收后仍不满足,抛出异常。
  • 问题:CLR GC会存在非法回收,导致资源损坏等。

终结器机制

  • 对象实例化时,若定义了Finalize 方法,将该对象指针加入到finalization集合。
  • 垃圾回收时,若finalization集合中存在该对象指针,则移除并将对象实例添加到freachable队列,否则触发垃圾回收。
  • 执行freachable队列中的Finalize 方法,并从队列中移除对象实例。
  • 问题:定义了Finalize 方法的对象至少需要两次GC才能完成垃圾回收。

猜你喜欢

转载自www.cnblogs.com/fuxuyang/p/11723441.html