找出C#中的对象正在使用多少内存?
有人知道一种对象实例占用多少内存的方法吗?
例如,如果我有以下对象的实例:
TestClass tc = new TestClass();
有没有办法找出实例tc占用多少内存?
提出问题的原因是,尽管Chas内置内存管理功能,但我经常遇到无法清除对象实例(例如,跟踪某事的列表)的问题。
有几个相当不错的内存分析器(例如ANTS Profiler),但是在多线程环境中,即使使用那些工具,也很难弄清楚什么属于哪里。
解决方案
回答
我在MemProfiler方面有很好的经验。它为我们提供了创建对象时的堆栈跟踪以及为什么仍未进行垃圾收集的原因的所有图表。
回答
如果我们不打算在代码本身中进行此操作(我根据ANTS参考假设),请尝试看看CLRProfiler(当前为v2.0)。它是免费的,如果我们不介意过于简单的UI,它可以提供有价值的信息。它将为我们提供各种统计数据的深入概述。我将它用作寻找内存韭葱的一种工具。
在这里下载:http://www.microsoft.com/downloads/details.aspx?FamilyId=A362781C-3870-43BE-8926-862B40AA0CD0&displaylang=en
如果我们确实想在代码中执行此操作,则CLR具有可使用的分析API。如果我们在CLRProfiler中找到该信息,因为它使用了这些API,因此我们也应该可以在代码中进行操作。更多信息在这里:
http://msdn.microsoft.com/de-de/magazine/cc300553(zh-cn).aspx
(它不像使用WinDbg那样神秘,但要做好深入CLR的准备。)
回答
微软免费提供的CLR Profiler在这类事情上做得很好。
整个分析器的介绍可在此处下载。 Patterns&Practices团队还将一些东西放在一起,详细说明了如何使用事件探查器。
在向我们显示不同的线程和在这些线程中创建的对象时,它做得相当合理。
希望这能有所启发。快乐的剖析!