CLR内存回收总结,代龄机制

关键字:对象可达图,代龄机制,终止化对象。

代龄机制:

0代满了之后,GC开始回收,剩下的对象升级为1代。(只有不可达的对象才会被回收。)

0代再回收几次之后,1代的对象慢慢增多然后达到阈值,GC同时回收0,1代对象。(只有不可达的对象才会被回收。)

1代回收剩下的升级2代,同样2代满了,GC会同时开始回收0,1,2代对象。(只有不可达的对象才会被回收。)

Finalize对象,终止链表,可达队列:

1. 当CLR在托管堆上分配对象时,GC检查该对象是否实现了自定义的Finalize方法(析构函数)。如果是,对象会被标记为可终结的,同时这个对象的指针被保存在名为终止链表的内部队列中。终结队列是一个由垃圾回收器维护的表,它指向每一个在从堆上删除之前必须被终结的对象。

2. Finalize对象不可达之后(没在任何地方被引用)

3.某个时刻GC开始第一次回收,发现这个Finalize对象,把它从终止链表中移到可达队列中,它复活了。特殊线程执行Finalize方法

4.特殊线程执行Finalize方法之后,GC从可达队列中清除引用,Finalize对象变成不可达对象等待未来的第二次回收。

至少要两次垃圾回收终止化对象和它所引用的对象在托管堆上的内存才能被回收,如果因为执行Finalize方法太长或其他原因第二次GC没有回收它,终止化对象代龄会增加,回收时间会更加的漫长。

原文地址:https://www.cnblogs.com/dirichlet/p/3266449.html