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...- -

 

 

posted on 2010-12-08 16:38  听说读写  阅读(765)  评论(0编辑  收藏  举报

导航