我的程序正在以非常高的速率(大约1MB/秒)将内存提升到Gen2,并且在发生Gen2收集时会导致性能影响。我每次尝试了解升级了哪些对象都失败了--主要是因为当我在windbg中打开2个转储时,Gen2大小增加的内存被标记为“空闲”。这让我怀疑是固定对象导致了这个问题,但perfmon的统计数据显示,固定对象的数量非常低(大约2-4个)。
我现在想尝试的是以某种方式识别哪些对象在运行时被提升为Gen2。有什么方法可以做到这一点吗?
发布于 2011-03-07 16:59:48
您可以使用WinDbg来调试此类问题。在垃圾收集例程上设置断点,检查托管堆,让垃圾收集发生,然后再次检查托管堆以查看哪些对象现在在Gen2中。
以下是一些可以开始的链接:
Tracking down managed memory leaks
How to iterate on the objects present in the .NET managed heap?
Tess Ferrandez' blog
Investigating .NET Memory Management and Garbage Collection
很抱歉,这不是对您问题的直接、详细的回答,但它应该给您一个起点。
发布于 2011-03-07 23:00:28
有一些第三方memory profilers for .NET,给他们一个尝试,其中大多数允许你免费试用期。我希望任何领先的内存分析器都能让您快速了解正在发生的事情。
发布于 2011-03-07 22:21:31
你可能分配了很多LOH。这是一个在LOH分配上有一个断点的方法。Winbdg中的bp mscorwks!wks::gc_heap::allocate_large_object “!CLRStack”。
HTH
https://stackoverflow.com/questions/5217553
复制相似问题