2 回答

TA貢獻(xiàn)1835條經(jīng)驗(yàn) 獲得超7個(gè)贊
我認(rèn)為您對(duì)垃圾收集器的目的有一些誤解。其目的不是為了最小化內(nèi)存使用;而是為了減少內(nèi)存使用。相反,它是為了確保您的進(jìn)程有可用的內(nèi)存。這是一個(gè)重要的區(qū)別。
垃圾收集器將定期清理內(nèi)存中不再使用的對(duì)象,并將它們標(biāo)記為要收集。稍后,當(dāng) GC 檢測到內(nèi)存不足時(shí),它將激活并:
移動(dòng)?xùn)|西,這樣你就有更少的小內(nèi)存塊和更多的大內(nèi)存塊(內(nèi)存只能在連續(xù)的塊中分配)。
收集對(duì)象并釋放它們的內(nèi)存。
它將很少運(yùn)行??梢詫?duì)其進(jìn)行配置,以根據(jù)特定要求定制 GC,但很少需要這樣做。每次 GC 運(yùn)行時(shí),它都會(huì)盡可能少地執(zhí)行操作以確保您的程序擁有所需的內(nèi)存。這樣做是因?yàn)槔占杀?em>高昂,并且可能導(dǎo)致明顯的性能峰值。
處置一個(gè)對(duì)象并不意味著“立即擺脫它并釋放其內(nèi)存”。意思是“我不再使用這個(gè)了,所以你可以在方便的時(shí)候清理它?!?nbsp;(軟件太有禮貌了?。┮虼?,處理上下文不會(huì)立即減少內(nèi)存使用量。可以向 GC 發(fā)出非常強(qiáng)烈的提示,表明您想要收集,但很少需要且不建議這么做。
所以,你的 GC 會(huì)等待。它會(huì)等待時(shí)機(jī),直到檢測到“嘿,我們內(nèi)存不足!” 然后,也只有到那時(shí),它才會(huì)檢查您的進(jìn)程是否有無法收集的對(duì)象。
因此,當(dāng)您的內(nèi)存消耗開始超過進(jìn)程可用的內(nèi)存時(shí),您可以預(yù)期 GC 將會(huì)運(yùn)行。然后,它將盡快釋放內(nèi)存。它的目標(biāo)只是確保您的進(jìn)程有可用的內(nèi)存。
那么,您可以期待觀察到什么?
你的進(jìn)程內(nèi)存會(huì)像過山車一樣上下波動(dòng)。它上漲的頻率會(huì)比下跌的頻率更高。
您的進(jìn)程內(nèi)存使用量將趨向于最大可用內(nèi)存,并且通常只會(huì)在接近限制時(shí)才會(huì)下降。
集合不會(huì)頻繁發(fā)生(根據(jù)需要),并且大小可能相差很大。
我認(rèn)為您無需擔(dān)心任何事情,并且建議您僅在開始出現(xiàn)內(nèi)存不足錯(cuò)誤時(shí)才擔(dān)心內(nèi)存使用情況。

TA貢獻(xiàn)2021條經(jīng)驗(yàn) 獲得超8個(gè)贊
您實(shí)際上可以使用 MemoryDiagnoser 查看內(nèi)存使用情況和 GC 收集的情況。我建議使用 GcMode Server 為 TRUE,因?yàn)樗鼘⒏玫叵蚰故?GC 如何在服務(wù)器上而不是在本地工作站上工作。我知道學(xué)習(xí)如何使用它很麻煩,但經(jīng)過一段時(shí)間后,這是非常值得的。
在 VS 中查看內(nèi)存使用情況的問題是因?yàn)樗幱谡{(diào)試模式,而這并不完全是您的代碼在發(fā)布時(shí)的行為方式。
- 2 回答
- 0 關(guān)注
- 170 瀏覽
添加回答
舉報(bào)