.Net垃圾收集器 - 查看运行时期间提升为Gen2的内容

gal*_*arm 8 .net c# debugging garbage-collection windbg

我的程序以非常高的速率(大约1MB /秒)向Gen2提升内存,并且当Gen2收集发生时它会导致性能损失.我为了解哪些对象被提升而做出的每一次尝试都失败了 - 主要是因为当我在windbg中打开2个转储时,Gen2大小增加的内存被标记为"Free".这让我怀疑Pinned对象引起了问题,但是perfmon统计数据显示固定对象的数量非常低(大约2-4).

我现在正在考虑的是以某种方式识别哪些对象在运行时被提升为Gen2.有这样做的方法吗?

slo*_*oth 5

您可以使用WinDbg来调试此类问题.在垃圾收集例程上设置断点,检查托管堆,发生垃圾收集,然后再次检查托管堆以查看Gen2中的哪些对象.

以下是一些开头的链接:

追踪托管内存泄漏

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

苔丝费兰德斯的博客

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

对不起,这不是你的问题的直接,详细的答案,但它应该给你一个起点.