CLR via C# 读书笔记 53 对象复活(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...- -

原文地址:https://www.cnblogs.com/PurpleTide/p/1900387.html