繁体   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