在C#app中运行时期间分析所有变量的内存使用情况

时间:2012-11-11 08:28:41

标签: c# variables memory profiling runtime

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

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

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

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

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

-------------编辑

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

1 个答案:

答案 0 :(得分:4)

  

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

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

例如,请考虑以下代码:

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

这里我们有三个变量,都指向同一个数组。你想要的工具会显示多少内存? 1MB,因为每一个指1MB阵列?这将是令人困惑的,因为显示的总内存为3MB,尽管实际上只使用了1MB。 0.3333MB?当然更令人困惑。 1MB?有点准确,但没有帮助。

你应该专注于哪些对象比你想要的更长时间保持活着,然后找出让这些对象保持活力的东西。

通常情况下,如果一个“看似简单的请求”似乎“逃过了专注于该领域的人的注意力”,那是因为它毕竟不是 一个简单的请求。