代码之家  ›  专栏  ›  技术社区  ›  JohnFx

我可以在性能监视器中使用哪个计数器来查看有多少内存在等待GC?

  •  2
  • JohnFx  · 技术社区  · 15 年前

    我正试图分析我的ASP.NET站点的一个特定页面,以优化内存使用,但是.NET作为垃圾收集语言的性质使得很难真正了解程序中如何使用和释放内存。

    是否有一个PerfMon计数器或其他分析方法,它不仅允许我查看分配了多少内存,还允许我查看程序释放了多少内存,并且只等待垃圾收集?

    2 回复  |  直到 15 年前
        1
  •  2
  •   Thomas Pornin    15 年前

    实际上,机器中没有任何东西真正知道等待垃圾收集的是什么:垃圾收集恰恰是找出问题并释放与死对象对应的内存的过程。充其量,GC只在其循环中的一些非常具体的瞬间拥有这些信息。检测和发布部分通常是交错的(这取决于GC技术),因此GC可能永远无法对可以释放的内容进行完整计数。

    对于大多数GC来说,获取这样的信息在计算上是昂贵的。如果您准备在它上面花费一点CPU时间(它对应用程序是不透明的),那么您可以使用 GC.Collect() 强制GC运行,然后立即调用 GC.GetTotalMemory() 了解GC中有多少内存存活下来。请注意,强制GC可能会引起明显的暂停,也可能会降低整体性能。

    这是“自制”方法;要进行更严肃的分析,请尝试使用专用的探查器。

        2
  •  2
  •   Mitchel Sellers    15 年前

    我分析内存的最好方法是使用来自 RedGate .您可以查看快照,它处于生命周期的哪个阶段以及更多。包括实际对象值。