c# 垃圾回收。 .NET CLR 内存性能计数器显示 0 代表 gen 0 堆大小等。这是啥意思?

Posted

技术标签:

【中文标题】c# 垃圾回收。 .NET CLR 内存性能计数器显示 0 代表 gen 0 堆大小等。这是啥意思?【英文标题】: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。这可以信任吗?如何区分以下两种情况?

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

【问题讨论】:

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

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

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

static void Main(string args[])

    Console.ReadLine();

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

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

static void Main(string args[])

    GC.Collect();
    Console.ReadLine();

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

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

【讨论】:

以上是关于c# 垃圾回收。 .NET CLR 内存性能计数器显示 0 代表 gen 0 堆大小等。这是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

C# using垃圾回收详解

重温CLR(十五) 托管堆和垃圾回收

浅析CLR的GC(垃圾回收器)

在远程 CLR 进程中强制进行垃圾回收

JavaScript性能优化1——内存管理(JS垃圾回收机制引用计数标记清除标记整理V8分代回收Performance使用)

JavaScript性能优化1——内存管理(JS垃圾回收机制引用计数标记清除标记整理)