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 堆大小等。这是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章
JavaScript性能优化1——内存管理(JS垃圾回收机制引用计数标记清除标记整理V8分代回收Performance使用)