【问题标题】:.Net Garbage Collector - See what is promoted to Gen2 during Runtime.Net 垃圾收集器 - 查看运行时提升到 Gen2 的内容
【发布时间】:2011-03-07 08:45:54
【问题描述】:

我的程序正在以非常高的速率(大约 1MB/秒)将内存提升到 Gen2,并且在 Gen2 收集发生时会导致性能下降。 我为了解提升了哪些对象所做的每一次尝试都失败了 - 主要是因为当我在 windbg 中打开 2 个转储时,用于增加 Gen2 大小的内存被标记为“空闲”。 这让我怀疑是固定对象导致了问题,但性能统计数据显示固定对象的数量非常低(大约 2-4)。

我现在正在考虑尝试以某种方式确定在运行时将哪些对象提升为 Gen2。 有没有办法做到这一点?

【问题讨论】:

  • 我怀疑你没有处理你的一次性物品。大多数未处置的对象将运行它们的终结器并从那里处置。终结器阻止 GC 收集 se section "How Finalization Affects Collection".
  • 你在分配大对象吗?在大对象堆上分配的 AFAIK 对象立即转到第 2 代。

标签: c# .net debugging garbage-collection windbg


【解决方案1】:

您可以使用 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

很抱歉,这不是对您问题的直接、详细的回答,但它应该为您提供一个起点。

【讨论】:

【解决方案2】:

有几个 3 方memory profilers for .NET,试试看,大部分都给你免费试用期。我希望任何领先的内存分析器都能让您快速了解正在发生的事情。

【讨论】:

    【解决方案3】:

    您可能会分配很多 LOH。这是一种在 LOH 分配上设置断点的方法。 bp mscorwks!wks::gc_heap::allocate_large_object “!CLRStack” 在 Winbdg 内。

    HTH

    【讨论】:

      【解决方案4】:

      您可以尝试强制 gen(0) 和 gen(1) 收集,并在它完成运行后立即拍摄快照

      GC.Collect(1,GCCollectionMode.Forced);
      GC.WaitForPendingFinalizers();
      CreateDump();
      

      另外,您使用的是哪种 GC 风格?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-06-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-04
        相关资源
        最近更新 更多