3 回答

TA貢獻(xiàn)1827條經(jīng)驗(yàn) 獲得超8個(gè)贊
我想強(qiáng)調(diào)Brian在評(píng)論中的觀點(diǎn),因?yàn)樗苤匾?/p>
終結(jié)器不是像C ++那樣的確定性析構(gòu)函數(shù)。正如其他人所指出的那樣,沒(méi)有什么時(shí)候會(huì)被稱為保證,而事實(shí)上,如果你有足夠的內(nèi)存,如果將永遠(yuǎn)被調(diào)用。
但是關(guān)于終結(jié)器的壞處是,正如Brian所說(shuō),它會(huì)使你的對(duì)象在垃圾收集中存活下來(lái)。這可能很糟糕。為什么?
正如您可能知道或不知道的那樣,GC分為幾代 - Gen 0,1和2,以及大對(duì)象堆。Split是一個(gè)松散的術(shù)語(yǔ) - 你得到一塊內(nèi)存,但是有一些指向Gen 0對(duì)象的起點(diǎn)和終點(diǎn)。
思考過(guò)程是你可能會(huì)使用很多短暫的物體。因此,對(duì)于GC來(lái)說(shuō),這些應(yīng)該是簡(jiǎn)單快速的 - Gen 0對(duì)象。因此,當(dāng)存在內(nèi)存壓力時(shí),它首先做的是Gen 0集合。
現(xiàn)在,如果它沒(méi)有解決足夠的壓力,那么它會(huì)返回并進(jìn)行第1代掃描(重做第0代),然后如果仍然不夠,則執(zhí)行第2代掃描(重做第1代和第0代)。因此,清理長(zhǎng)壽命對(duì)象可能需要一段時(shí)間并且相當(dāng)昂貴(因?yàn)槟木€程可能在操作期間被掛起)。
這意味著,如果您執(zhí)行以下操作:
~MyClass() { }
無(wú)論如何,您的對(duì)象都將存在于第2代。這是因?yàn)镚C無(wú)法在垃圾回收期間調(diào)用終結(jié)器。所以必須最終確定的對(duì)象被移動(dòng)到一個(gè)特殊的隊(duì)列,由另一個(gè)線程清理掉(終結(jié)器線程 - 如果你殺了它就會(huì)發(fā)生各種壞事)。這意味著您的對(duì)象會(huì)更長(zhǎng)時(shí)間地掛起,并可能會(huì)強(qiáng)制更多垃圾收集。
所以,所有這一切只是為了讓你想要使用IDisposable來(lái)盡可能地清理資源,并認(rèn)真嘗試找到使用終結(jié)器的方法。這符合您的應(yīng)用程序的最佳利益。
- 3 回答
- 0 關(guān)注
- 522 瀏覽
添加回答
舉報(bào)