【问题标题】:C#: Memory usage of an objectC#:对象的内存使用情况
【发布时间】:2010-10-08 01:00:46
【问题描述】:

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

【问题讨论】:

标签: c# memory memory-management


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      您确实必须准确地定义“特定对象使用了多少内存”的意思。例如,您可以表示“如果该对象被垃圾回收,将释放多少内存” - 或者您可以表示“该对象及其所接触的所有内容占用了多少内存。”

      你关于字符串实习的观点就是一个很好的例子。假设你这样做:

      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 如果我从数据库中获取一大堆行(其中许多行在某些列中包含相同的字符串),应该我努力确保他们被拘留,还是我不应该为此烦恼?
      • 我会先做最简单的事情,然后分析您的应用程序以查看它使用了多少内存。不过,我不会使用 String.Intern - 我已经在您的其他问题上留下了答案来解释原因。
      【解决方案4】:

      您尝试过 CLR Profiler 2.0 吗?

      【讨论】:

      • 没有。也许应该试试那个。虽然希望在代码中有所作为。所以我可以使用 Console.WriteLine(MemoryUsageOf(someObject)) 之类的:p
      • CLR Profiler 为您提供了丰富的内存信息...编写代码的最佳方式是完全不编写代码;)
      • 如果它可以工作...运行程序有效,启动我的程序有效。但是当我退出程序时,CLR Profiler 会抛出异常:
      猜你喜欢
      • 2014-07-30
      • 2011-11-02
      • 2010-11-26
      • 2012-01-13
      • 1970-01-01
      • 2022-01-12
      • 2012-08-27
      • 2011-06-15
      相关资源
      最近更新 更多