.NET垃圾回收分析:计算代码产生了多少垃圾

5

我想编写一个实用类,帮助我确定某段代码产生了多少垃圾。

我想要这样使用它: GarbageProfiler.Start();int numGarbage = GarbageProfiler.End();

这个想法很简单。但是这么做有意义吗?是否有工具可以做到这一点?


当你说“garbage”时,你的意思是什么? - John Saunders
3
定义垃圾。从垃圾回收的角度来看,一切都是垃圾,只有一部分稍后被收集。 - Willem van Rumpt
@Willem:垃圾由GC根无法访问的对象组成。他可能想知道在运行完成后分配了多少字节是不可访问的。 - Gabe
3个回答

1
但这样做有意义吗?
不。
你至少需要区分垃圾的世代。
某段代码分配并且在结束时仍然保留的内存,比它快速释放的对象更加昂贵。

0

已经有相当多的内存分析器可供使用。在Google上进行快速搜索即可找到几个。

甚至还有一个.Net应用程序的内存分析API。


我简单尝试了一下提供的示例,但似乎无法正常工作。 - Waldo Bronchart

0

一个引用后面的垃圾数量会因为它是否持有对象的最后一个引用而在每次运行时改变。因此,预测垃圾的数量非常困难。

GC.Collect()之前和之后读取一些性能计数器可能会给你一个想法。

我确实质疑这一切的使用;你永远不知道GC何时启动,因此你不知道垃圾何时被回收。而调用GC.Collect()并不是一个很好的主意(大多数情况下)。


GC.Collect()在分析器中可能是个好主意。但我同意整件事情仍然毫无意义。 - H H

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接