2009-02-17 32 views
5

有没有办法找到有多少内存用于特定的对象?例如一个列表。考虑所有事情,比如字符串实习,以及编译器/运行时环境/不管什么。C#:一个对象的内存使用情况

+0

Duplicated:http://stackoverflow.com/questions/426396/how-much-memory-does-ac-net-object-use – FerranB 2009-02-17 09:23:38

+0

所以看起来...对不起'布特:) :) – Svish 2009-02-17 10:21:35

回答

2

你真的必须明确定义你的意思是“多少内存用于特定对象”。例如,你可能的意思是“如果这个对象被垃圾收集了,多少会被释放” - 或者你可能意思是“这个对象和它接触到的东西占用多少内存”。

您对字符串实习点就是一个很好的例子。假设你:

List<string> internedStrings = new List<string>(); 
List<string> nonInternedStrings = new List<string>(); 
for (int i=0; i < 1000; i++) 
{ 
    string tmp = new string(' ', i+1); 
    nonInternedStrings.Add(tmp); 
    tmp = tmp.Intern(); 
    internedStrings.Add(tmp); 
} 

是否真的nonInternedStrings占用更多的内存比internedStrings?如果internedStrings进行垃圾回收,它不会释放尽可能多的内存 - 但如果internedStrings从未创建(不包括实习它的每个元素),那么永远也不会需要更多的内存。

如果您可以更具体地了解刚好您的意思是,我们可能会帮助您。但这是一个复杂的问题。

1

你试过CLR探查器2.0?

+1

号应该也许尝试一个。虽然希望在代码中的东西。所以,我可以排序Console.WriteLine(MemoryUsageOf(someObject))之类的东西:对 – Svish 2009-02-17 08:40:01

2

这似乎是这个Delphi question的兄弟。朴素算法不会考虑聚合和组合之间的差异。即使是基于标记和扫描的算法也不会告诉你散列表是否必须增长其内部数组,因为对象是由它引用的。您可能更适合针对各种情况分析您的应用程序,并针对N绘制资源使用情况,其中N是您数据集规模的一些衡量标准。

5

ANTS Memory Profiler型材的.NET代码的存储器消耗。过去我已经有了很好的成绩。