繁体   English   中英

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

[英]Profiling memory usage of all variables during runtime in C# app

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

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

尽管我还没有尝试过dotTrace或ANTS Memory Profiler,但是扫描FAQ,视频和屏幕截图也会使空白。

除了我自己的变量外,所需的探查器可能还包括任何.NET应用程序所特有的“开销”内存使用情况,尽管对我而言,这并不重要。

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

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

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

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

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

因此,例如,考虑以下代码:

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

在这里,我们有三个变量,都引用同一数组。 您所需的工具将显示每个人占用了多少内存? 1MB,因为每个引用一个1MB阵列? 这将造成混乱,因为尽管实际只使用了1MB,但显示的总内存为3MB。 0.3333MB? 当然更令人困惑。 1MB? 有点准确,但无济于事。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM