.NET GC简单理解
其他
2019-10-22 23:50:50
阅读次数: 0
对象实例化过程
- 计算对象大小。
- 添加对象指针和同步索引块。
- 从内存指针处开始,分配对象内存。
- 问题:内存不能无限制增长。
垃圾回收
- 从应用程序实例出发,标记所有的引用对象
- 将标记对象移动到低地址端,修正实例引用地址与内存指针。
- 问题:全内存移动对象,垃圾回收性能不高。
分代回收
- 将对象分代(0、1、2),对低代对象进行垃圾回收,幸存对象升级为高代对象。
- 低代对象垃圾回收也无法满足时高代对象进行垃圾回收,若2代垃圾回收后仍不满足,抛出异常。
- 问题:CLR GC会存在非法回收,导致资源损坏等。
终结器机制
- 对象实例化时,若定义了Finalize 方法,将该对象指针加入到finalization集合。
- 垃圾回收时,若finalization集合中存在该对象指针,则移除并将对象实例添加到freachable队列,否则触发垃圾回收。
- 执行freachable队列中的Finalize 方法,并从队列中移除对象实例。
- 问题:定义了Finalize 方法的对象至少需要两次GC才能完成垃圾回收。
转载自www.cnblogs.com/fuxuyang/p/11723441.html