0

我使用性能計數器監視我的.NET應用程序的高內存問題很好的措施。爲了測量.NET記憶,我的印象是,字節數在所有堆性能計數器提供全面的管理內存的使用情況。但根據MSDN,此計數器不包含Gen 0堆大小。爲什麼字節數在所有堆考慮整體託管堆

顯示第1代堆大小,第2代堆大小和大的總和 對象堆大小計數器。該計數器指示垃圾收集堆中以字節分配的當前內存 。

如果一個.NET應用程序在Gen 0中分配了很多內存,那麼在所有堆的#字節中是否也不應該考慮這一點?我知道Gen 0堆的大小有一個單獨的計數器,但Gen 1,Gen 2和LoH也是如此。

+2

您不能在gen 0中分配「巨大的內存」。大分配在大對象堆上進行。這個名字不是巧合。 –

+0

在高內存點進行內存轉儲,並使用WinDbg或分析器對其進行分析。這將告訴你什麼使用所有的內存。 – xxbbcc

+0

對不起,我的意思是大量的分配對於LOH來說不一定很大。對不起我的英語,但我總是努力使用適當的措辭:)我希望已經在我的問題中澄清了它現在 – BKS

回答

2

這是相當主觀的。但是當你問「我的.NET應用程序使用多少內存」這個問題時,你通常不會對存活毫秒或更少的內存分配感興趣。可以這麼說,「工作記憶」。由存儲在gen#0堆段中的對象使用。

只有當這樣的對象活得足夠長,從而獲得晉升到更高的世代,你可以開始有效地擔心,也許你的應用程序沒有使用的內存。永遠不要擔心gen#0。

非零機率另一實用性發揮了作用。如果計數器還會顯示gen#0,那麼它將是一個數量急劇變化的數字,會非常迅速地上下跳動。圖中基本上是白色的噪音,不是很友好。

1

注意,「第0堆大小」不告訴你有多少在第0字節堆中的對象佔用 - 它總是預先分配到一定的規模和分配過程中不生長。這個數字只是告訴你爲Gen 0分配預分配了多少內存。

沒有真正的實時方法來獲得第0代中物體的大小 - 這是一個有點過高的流量,使它值得。相比之下,第1代和第2代堆只能在垃圾收集期間填充 - 在那裏設置性能計數器是微不足道的。 LOH有類似的推理 - 你分配足夠大的對象,所以增加性能計數器的成本大多是微不足道的。

不要忘記Gen 0對象不能長時間停留在第0代 - 在下一次收集時,他們要麼被釋放或移動到第1代。很難想象一個場景,Gen 0堆大量填充 - 事實上,IIRC,它相對於CPU緩存進行縮放;儘管在現代CPU上這不是「小」的,但它也清楚地表明瞭它的意圖 - 它是幾個即將被扔掉或被移走的小物體的草稿書。