我的程序正在以非常高的速率(大约 1MB/秒)将内存提升到 Gen2,当发生 Gen2 收集时它会导致性能下降。 我试图了解哪些对象被提升的每一次尝试都失败了——主要是因为当我在 windbg 中打开 2 个转储时,用于增加 Gen2 大小的内存被标记为“空闲”。 这让我怀疑是 Pinned 对象导致了问题,但 perfmon 统计数据显示 Pinned 对象的数量非常低(大约 2-4)。
我现在想尝试的是在运行时以某种方式识别哪些对象被提升到 Gen2。 有没有办法做到这一点?
最佳答案
您可以使用 WinDbg 来调试此类问题。在垃圾收集例程上设置断点,检查托管堆,让垃圾收集发生,然后再次检查托管堆以查看现在哪些对象在 Gen2 中。
这里有一些链接可以开始:
Tracking down managed memory leaks
How to iterate on the objects present in the .NET managed heap?
Investigating .NET Memory Management and Garbage Collection
抱歉,这不是您问题的直接、详细的答案,但它应该给您一个起点。
关于c# - .Net Garbage Collector - 查看在运行时提升到 Gen2 的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5217553/