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

Posted

技术标签:

【中文标题】在 C# 应用程序运行时分析所有变量的内存使用情况【英文标题】:Profiling memory usage of all variables during runtime in C# app 【发布时间】:2012-11-11 08:28:41 【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

【参考方案1】:

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

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

例如,考虑以下代码:

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

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

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

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

【讨论】:

我很少像您在此处显示的那样将变量引用到其他变量,但根据您在此处所说的内容,也许我应该将“变量”重命名为“对象”。我确实想要这些名称,因为它们会出现在我的代码中,然后我可以快速导航到它们。知道 Int32[] 占用 1GB 的帮助较少——我想知道代码中的变量名。我想在您的示例中,分析器可以将这样的引用分组。这不是不可克服的。 @DanW:对象没有名称——这就是重点。我不知道跟踪“当前”持有对对象的引用的每个变量的名称有多可行...... 对。是的,它必须是变量的名称。当然,我不可能是唯一一个想到或想要这个的人吗?至少在我的情况下,最好查看所有 var 名称的列表。 顺便说一下,澄清一下,它不必记录所有存在的变量名,只需记录“原始”变量名即可。例如,如果一个变量通过引用传递给一个方法,那么它也不会费心显示该名称(当然这将是相同的内存),只需显示原始名称。现在更有意义了吗?

以上是关于在 C# 应用程序运行时分析所有变量的内存使用情况的主要内容,如果未能解决你的问题,请参考以下文章

分而治之解决数字的力量,使用主定理进行运行时分析

在Firefox中分析Webworkers

如何在 C 中分析 openMPI 程序的内存使用情况和性能

如何动态扩展内存映射文件

在 Linux 上的 C++ 程序中分析常驻内存使用情况和许多页面错误

C++ 动态内存