CLR via C# 读书笔记 5-3 对象复活(Resurrection)
1. 对象复活
当GC想调用一个对象的Finalize方法的时候
GC会强制这个对象处于 活 的状态
只有当Finalize方法调用完成以后,这个对象才会永久的消失
主要原因是:Finalize方法中可能使用到这个对象的字段(Field),所以Finalize的过程中需要保证可以访问这些字段,所以要保证对象处在 活的状态
当Finalize方法执行完成的时候,这个对象才会真正的消失
2. 应用场景
一般情况下需要尽量避免使用对象复活,除非是一个对象需要被重复的使用,(其实我觉得还不如不回收这个对象呢,就让他一直活着吧)
3.当一个静态字段被Finalize的时候
internal sealed class SomeType {
~SomeType() {
Program.s_ObjHolder = this;
}
}
public static class Program {
public static Object s_ObjHolder; // Defaults to null
}
当SomeType对象的Finalize方法被调用的时候,由于 有一个根节点引用了SomeType,同时SomeType这个对象被移动到Freachable队列中,这里就发生了对象复活,不过这个时候SomeType对象处在不可预料的情况 (- - 为了程序的稳定最好还是别用他)
PS:一个有Finalize方法的对象需要两次GC才会真正的挂掉
PS: 不知道怎么翻译freachable queue...- -