C#:对象的内存使用情况

时间:2009-02-17 08:33:08

标签: c# memory memory-management

有没有办法找到特定对象使用了多少内存?例如一个List。将所有内容都考虑在内,比如字符串实习以及编译器/运行时环境/无论做什么。

4 个答案:

答案 0 :(得分:5)

ANTS Memory Profiler描述了.NET代码的内存消耗。我过去得到了很好的结果。

答案 1 :(得分: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从未被创建(包括没有实现其每个元素的实习)那么会有更多内存从来没有被要求过。

如果你能更准确地了解 你的意思,我们可以帮助你。但这是一个复杂的问题。

答案 2 :(得分:2)

这似乎是这个Delphi question的兄弟姐妹。天真的算法不会考虑聚合和组合之间的差异。即使是基于标记和扫描的算法也不会告诉您哈希表是否必须增长其内部数组,因为它引用了一个对象。您可能最好在各种场景下分析应用程序,并将资源使用情况与N进行绘制,其中N是对数据集规模的一些衡量标准。

答案 3 :(得分:1)

您是否尝试过CLR Profiler 2.0?