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

5

有没有办法找出特定对象使用了多少内存?例如List。考虑全部因素,如字符串插值和编译器/运行环境等所做的任何操作。


重复的问题:https://dev59.com/IXRC5IYBdhLWcg3wD8tV - FerranB
看起来好像出了点问题...抱歉 :) - Svish
可能是一个C#/.NET对象使用多少内存?的重复问题。 - sɐunıɔןɐqɐp
4个回答

5

ANTS Memory Profiler 可以对 .NET 代码的内存消耗进行分析。过去我曾经用它并且取得了很好的效果。


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从未被创建(包括不将其每个元素作为国际化字符串处理),则永远不需要更多内存。如果您能更具体地说明您的意思,我们可能会帮助您。但这是一个复杂的问题。"

好的,这正是我想要找到的:p 如果我从数据库中获取了一堆行(其中许多行在某些列中包含相同的字符串),我是否需要确保它们是内部化的,或者我不必烦恼? - Svish
我会先尝试最简单的方法,然后对您的应用程序进行分析,以查看它使用了多少内存。不过,我不会使用String.Intern - 我已经在您的其他问题上留下了答案来解释原因。 - Jon Skeet

2
这似乎是这个Delphi问题的姊妹问题。一个天真的算法不会考虑到聚合和组合之间的差异。即使基于标记和清除的算法也无法告诉您哈希表是否必须增加其内部数组,因为对象被它引用。您最好对应用程序进行各种场景的分析,并将资源使用情况与数据集规模的某些度量N绘制成图。

1

你试过 CLR Profiler 2.0 吗?


1
不。也许应该尝试一下那个。不过我希望有一些代码可以这样写 Console.WriteLine(MemoryUsageOf(someObject)) 或者其他类似的方式来输出内存使用情况。 :p - Svish
CLR Profiler 为您提供了丰富的内存信息,是一个与内存相关的工具。编写代码的最佳方式是根本不编写代码 ;) - Vyas Bharghava
如果它能够工作...运行程序是可以的,启动我的程序也是可以的。但是当我退出我的程序时,CLR Profiler会抛出一个异常: - Svish

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接