C#:对象的内存使用情况
有没有办法找到特定对象使用了多少内存? 例如一个List。 考虑到所有因素,例如字符串实习以及编译器/运行时环境/无论做什么。
你真的必须准确定义“用于特定对象的内存量”的含义。 例如,你可能意味着“如果这个对象被垃圾收集,将释放多少” – 或者你可能意味着“这个对象及其触及的所有内容占用了多少内存。”
关于字符串实习的观点是一个很好的例子。 假设你这样做:
List internedStrings = new List (); List nonInternedStrings = new List (); for (int i=0; i < 1000; i++) { string tmp = new string(' ', i+1); nonInternedStrings.Add(tmp); tmp = tmp.Intern(); internedStrings.Add(tmp); }
nonInternedStrings
是否真的占用了比nonInternedStrings
更多的内存? 如果internedStrings
被垃圾收集,它就不会释放那么多的内存 - 但是如果internedStrings
从未被创建过 (包括没有实现它的每个元素),那么就不会需要更多的内存。
如果您可以更准确地了解您的意思,我们可能会帮助您。 但这是一个复杂的问题。
ANTS Memory Profiler描述.NET代码的内存消耗。 我过去曾经取得过很好的成绩。
这似乎是这个德尔菲问题的兄弟姐妹。 天真的算法不会考虑聚合和组合之间的差异。 即使是基于标记和扫描的算法也不会告诉您哈希表是否必须增长其内部数组,因为它引用了一个对象。 您可能最好为各种场景分析应用程序,并将资源使用情况与N进行绘制,其中N是数据集规模的一些度量。
你试过CLR Profiler 2.0吗?