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

Svi*_*ish 5 c# memory memory-management

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

Ian*_*son 5

ANTS Memory Profiler描述.NET代码的内存消耗.过去我用它取得了很好的成绩.


Jon*_*eet 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);
}
Run Code Online (Sandbox Code Playgroud)

nonInternedStrings真的比 占用更多内存吗internedStrings?如果internedStrings进行垃圾收集,它不会释放那么多内存 - 但如果internedStrings从未创建过(包括不驻留其每个元素),则永远不会需要更多内存。

如果您能更具体地说明的意思,我们也许能为您提供帮助。但这是一个复杂的问题。