【发布时间】:2010-10-08 01:00:46
【问题描述】:
有没有办法找出特定对象使用了多少内存?例如一个列表。考虑到所有因素,例如字符串实习和编译器/运行时环境/无论做什么。
【问题讨论】:
-
看来...抱歉 :)
标签: c# memory memory-management
有没有办法找出特定对象使用了多少内存?例如一个列表。考虑到所有因素,例如字符串实习和编译器/运行时环境/无论做什么。
【问题讨论】:
标签: c# memory memory-management
ANTS Memory Profiler 分析 .NET 代码的内存消耗。过去我用它取得了很好的成绩。
【讨论】:
这似乎是Delphi question 的兄弟。天真的算法不会考虑聚合和组合之间的差异。即使是基于标记和扫描的算法也不会告诉您哈希表是否必须增长其内部数组,因为它引用了一个对象。您可能最好针对各种场景分析您的应用程序并根据 N 绘制资源使用情况,其中 N 是数据集规模的某种度量。
【讨论】:
您确实必须准确地定义“特定对象使用了多少内存”的意思。例如,您可以表示“如果该对象被垃圾回收,将释放多少内存” - 或者您可以表示“该对象及其所接触的所有内容占用了多少内存。”
你关于字符串实习的观点就是一个很好的例子。假设你这样做:
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 从未创建(包括不实习其每个元素),则永远不需要更多内存.
如果您能更具体地准确了解您的意思,我们或许可以为您提供帮助。这是一个复杂的问题。
【讨论】:
您尝试过 CLR Profiler 2.0 吗?
【讨论】: