CLR via C# 讀書筆記 5-3 對(duì)象復(fù)活(Resurrection)
1. 對(duì)象復(fù)活
當(dāng)GC想調(diào)用一個(gè)對(duì)象的Finalize方法的時(shí)候
GC會(huì)強(qiáng)制這個(gè)對(duì)象處于 活 的狀態(tài)
只有當(dāng)Finalize方法調(diào)用完成以后,這個(gè)對(duì)象才會(huì)永久的消失
主要原因是:Finalize方法中可能使用到這個(gè)對(duì)象的字段(Field),所以Finalize的過程中需要保證可以訪問這些字段,所以要保證對(duì)象處在 活的狀態(tài)
當(dāng)Finalize方法執(zhí)行完成的時(shí)候,這個(gè)對(duì)象才會(huì)真正的消失
2. 應(yīng)用場(chǎng)景
一般情況下需要盡量避免使用對(duì)象復(fù)活,除非是一個(gè)對(duì)象需要被重復(fù)的使用,(其實(shí)我覺得還不如不回收這個(gè)對(duì)象呢,就讓他一直活著吧)
3.當(dāng)一個(gè)靜態(tài)字段被Finalize的時(shí)候
internal sealed class SomeType {
~SomeType() {
Program.s_ObjHolder = this;
}
}
public static class Program {
public static Object s_ObjHolder; // Defaults to null
}
當(dāng)SomeType對(duì)象的Finalize方法被調(diào)用的時(shí)候,由于 有一個(gè)根節(jié)點(diǎn)引用了SomeType,同時(shí)SomeType這個(gè)對(duì)象被移動(dòng)到Freachable隊(duì)列中,這里就發(fā)生了對(duì)象復(fù)活,不過這個(gè)時(shí)候SomeType對(duì)象處在不可預(yù)料的情況 (- - 為了程序的穩(wěn)定最好還是別用他)
PS:一個(gè)有Finalize方法的對(duì)象需要兩次GC才會(huì)真正的掛掉
PS: 不知道怎么翻譯freachable queue...- -
posted on 2010-12-08 16:38 聽說讀寫 閱讀(781) 評(píng)論(0) 收藏 舉報(bào)
浙公網(wǎng)安備 33010602011771號(hào)