[英].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中的哪些对象。
以下是一些开头的链接:
对不起,这不是你的问题的直接,详细的答案,但它应该给你一个起点。
你可能会分配很多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.