簡體   English   中英

.net應用程序對象升級為第2代

[英].net application object promoted to gen 2

我一直試圖在我的應用程序中修復內存泄漏。 幾個月前,我注意到在我的應用程序中,超過95%的對象被提升為Gen2; 我有一些非常基本的問題,我在書中找不到。 我希望你們能幫助我:

  1. 有這么多Gen2對象是壞消息嗎? 在我拍攝的每個快照中,我在WinDbg中獲得77,000個Gen2對象,100個Gen1對象和10個Gen0對象。
  2. 我怎樣才能找到這么多對象被提升的原因? 有一個好工具嗎? 我一直在使用WinDbg / SOS而且運氣不好

先感謝您。

有這么多Gen2對象是壞消息嗎?

這不是壞消息。 這可能意味着GC.Collect剛剛運行,或者它經常運行,並且你有足夠的空閑內存 - 因此Gen2中的對象不會被收集。 以下是另一個StackOverflow問題的一些很好的解釋, 垃圾收集即使在需要時也沒有發生

啟動垃圾收集時,GC確定需要收集哪些代(0,0 + 1或全部)。 每一代都有一個由GC確定的大小(它可以隨着應用程序的運行而改變)。 如果只有第0代將超過其預算,那么這是唯一將收集垃圾的一代。 如果在第0代中存活的對象將導致第1代超過其預算,那么第1代也將被收集,其幸存的對象將被提升為第2代(這是Microsoft實現中的最高代)。 如果超過第2代的預算,則將收集垃圾,但是不能將對象提升到更高的一代,因為不存在。

因此,這里有重要信息,以最常見的方式啟動GC,只有在第0代和第1代都滿時才會收集第2代。 此外,您需要知道超過85,000個字節的對象不會存儲在具有第0代,第1代和第2代的普通GC堆中。它實際上存儲在所謂的大對象堆(LOH)中。 LOH中的內存僅在FULL集合期間釋放(即,在收集第2代時); 從來沒有只收集過0或1代。

對於你的第二個問題:

我怎樣才能找到這么多對象被提升的原因? 有一個好工具嗎? 我一直在使用WinDbg / SOS而且運氣不好

Windbg和SOS很好:)在這種情況下我建議添加psscor2(或psscor4,如果使用.NET 4.0)你需要使用psscor輕松轉儲特定代的對象。

以下是下載psscor2psscor4 dll的官方鏈接。 將適當版本的版本放入安裝Windbg的文件夾中。 x86版本的dll到x86文件夾(C:\\ Program Files(x86)\\ Debugging Tools for Windows),x64版本的dll到x64文件夾(C:\\ Program Files \\ Debugging Tools for Windows(x64))。

然后你就可以運行下一個命令:

    !dumpheap -gen 2

當psscor這樣做時,SOS沒有簡單的命令來轉儲特定代的對象。

使用此命令,您可以創建類似的結構

.foreach (obj { !dumpheap -gen 2 -short }) { !do ${obj} }

要么

.foreach (obj { !dumpheap -gen 2 -type ExactTypeName -short }) { !gcroot ${obj} }

找出第2代中對象的主要類型,以及哪些方法引用它們。

正如你所說,你的主要想法是找到內存泄漏,你應該使用更通用的方法,而不僅僅分析生成。 以下是我分析高內存使用問題的帖子:

管理記憶

http://kate-butenko.blogspot.com/2012/06/investigating-memory-issues-high-memory.html

非托管內存

http://kate-butenko.blogspot.com/2012/07/investigating-issues-with-unmanaged.html

http://www.codeproject.com/Articles/31382/Memory-Leak-Detection-Using-Windbg

如果您仍然堅持一些步驟,請留下您的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM