【问题标题】:c# Garbage Collection. .NET CLR Memory Perfmon counters showing 0 for gen 0 heap size etc. What does this mean?c# 垃圾回收。 .NET CLR 内存性能计数器显示 0 代表 gen 0 堆大小等。这是什么意思?
【发布时间】:2014-10-26 21:54:31
【问题描述】:

我一直在阅读有关 .NET CLR 内存性能计数器的信息

http://msdn.microsoft.com/en-us/library/x2tyfybc(v=vs.110).aspx

许多计数器都有以下警告:

This counter is updated at the end of a garbage collection, not at each allocation.

我发现了一个应用程序的内存泄漏,并检查了所有堆上的第 0 代堆大小、第 1 代、# 个字节,它们显示为 0。这可以信任吗?如何区分以下两种情况?

  1. 尚未进行垃圾回收
  2. 我的应用没有任何 gen 0,1 etc 分配 ?

【问题讨论】:

  • GC 根本没有运行确实是内存泄漏的一个很好的理由。很难编写这样的代码,您必须分配大量非托管内存,例如位图或 COM 对象。抛出一个 GC.Collect() 调用并看看。

标签: c# .net memory-leaks garbage-collection


【解决方案1】:

我会把钱花在 1) 垃圾收集还没有发生。

我比较了以下两种场景的性能监视器输出:

static void Main(string args[])
{
    Console.ReadLine();
}

在这种情况下,性能监视器在所有堆中显示 0 字节。

其中显示所有堆中有 22,496 个字节。

static void Main(string args[])
{
    GC.Collect();
    Console.ReadLine();
}

这表明即使是没有直接分配内存的空应用程序也有一些堆分配。

您可以通过在代码中的某处调用 GC.Collect 来测试这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-20
    • 2011-06-13
    • 1970-01-01
    • 2012-04-20
    • 2020-11-30
    • 2015-03-20
    • 2013-04-20
    • 2020-04-02
    相关资源
    最近更新 更多