簡體   English   中英

.Net垃圾收集器 - 查看運行時期間提升為Gen2的內容

[英].Net Garbage Collector - See what is promoted to Gen2 during Runtime

我的程序以非常高的速率(大約1MB /秒)向Gen2提升內存,並且當Gen2收集發生時它會導致性能損失。 我為了解哪些對象被提升而做出的每一次嘗試都失敗了 - 主要是因為當我在windbg中打開2個轉儲時,Gen2大小增加的內存被標記為“Free”。 這讓我懷疑Pinned對象引起了問題,但是perfmon統計數據顯示固定對象的數量非常低(大約2-4)。

我現在正在考慮的是以某種方式識別哪些對象在運行時被提升為Gen2。 有這樣做的方法嗎?

您可以使用WinDbg來調試此類問題。 在垃圾收集例程上設置斷點,檢查托管堆,發生垃圾收集,然后再次檢查托管堆以查看Gen2中的哪些對象。

以下是一些開頭的鏈接:

追蹤托管內存泄漏

如何迭代.NET托管堆中存在的對象?

苔絲費蘭德斯的博客

研究.NET內存管理和垃圾收集

對不起,這不是你的問題的直接,詳細的答案,但它應該給你一個起點。

.NET有一些3方內存分析器 ,試一試,大多數允許你免費試用期。 我希望任何領先的內存分析器都能讓你快速了解正在發生的事情。

你可能會分配很多LOH。 這是一種在LOH分配上有一個斷點的方法。 bp mscorwks!wks::gc_heap::allocate_large_object “!CLRStack”在Winbdg中。

HTH

您可以嘗試強制gen(0)和gen(1)集合,並在完成運行后立即拍攝快照

GC.Collect(1,GCCollectionMode.Forced);
GC.WaitForPendingFinalizers();
CreateDump();

另外,你使用什么樣的GC風味?

暫無
暫無

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

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