2 回答

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

TA貢獻2021條經驗 獲得超8個贊
您實際上可以使用 MemoryDiagnoser 查看內存使用情況和 GC 收集的情況。我建議使用 GcMode Server 為 TRUE,因為它將更好地向您展示 GC 如何在服務器上而不是在本地工作站上工作。我知道學習如何使用它很麻煩,但經過一段時間后,這是非常值得的。
在 VS 中查看內存使用情況的問題是因為它處于調試模式,而這并不完全是您的代碼在發布時的行為方式。
- 2 回答
- 0 關注
- 161 瀏覽
添加回答
舉報