-1

为了将我的 C# 应用程序中的内存占用减少到限制以下(大约 1-2GB),我希望实时(在运行时)查看所有变量的列表,以及它们消耗了多少内存(甚至可能是内容)。

在我看来,这个看似简单的请求似乎已经逃脱了内存分析器的注意。例如,.NET Memory Profiler 显示每个给定类型(例如 Int32[] 或 String)的内存,但似乎不允许更精细的粒度来显示每个命名变量的内存。

虽然我没有尝试过 dotTrace 或 ANTS Memory Profiler,但扫描常见问题解答、视频和屏幕截图也是空白。

除了我自己的变量之外,所需的分析器可能包括任何 .NET 应用程序典型的“开销”内存使用情况,尽管对我来说,这并不重要。

有没有可以做到这一点的程序(最好是免费的或低于 100 美元)?

- - - - - - - 编辑

对于相互引用的变量(如 Jon Skeet 所示),或通过引用传递给方法的变量,分析器可以将它们分组以显示它们实际上是同一个对象(因此“共享”相同的内存),或者只显示原始变量名并省略引用。

4

1 回答 1

4

但似乎不允许更精细的粒度来显示每个命名变量的内存。

那可能是因为它没有多大意义。变量本身通常不会占用太多内存——它是占用内存的对象,而变量只是防止这些对象被垃圾收集。

例如,考虑以下代码:

byte[] array = new byte[1024 * 1024]; // 1MB
byte[] array2 = array;
byte[] array3 = array;

这里我们有三个变量,都指向同一个数组。您想要的工具会显示他们每个人占用多少内存?1MB,因为每个都指一个1MB的数组?这会令人困惑,因为尽管实际只使用了 1MB,但显示的总内存为 3MB。0.3333MB?肯定更混乱。1MB?有点准确,但无济于事。

您应该专注于哪些对象比您希望的存活时间更长,然后找出使这些对象保持存活的原因。

通常,如果一个“看似简单的请求”似乎已经“逃脱了该领域专业人士的注意”,那是因为它毕竟不是一个简单的请求。

于 2012-11-11T08:36:14.037 回答