Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C#应用程序中分析运行时所有变量的内存使用情况_C#_Variables_Memory_Profiling_Runtime - Fatal编程技术网

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

在C#应用程序中分析运行时所有变量的内存使用情况,c#,variables,memory,profiling,runtime,C#,Variables,Memory,Profiling,Runtime,为了将我的C#应用程序中的内存占用降低到限制以下(大约1-2GB),我希望看到所有变量的实时列表(在运行时),以及它们占用的内存量(甚至可能是内容) 在我看来,这个看似简单的请求似乎没有引起内存分析器的注意。例如,NET内存分析器显示每个给定类型(例如Int32[]或字符串)的内存,但似乎不允许更精细的粒度显示每个命名变量的内存 虽然我还没有尝试过dotTrace或ANTS Memory Profiler,但扫描常见问题解答、视频和屏幕截图也是一片空白 除了我自己的变量外,所需的探查器可能会包括

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

在我看来,这个看似简单的请求似乎没有引起内存分析器的注意。例如,NET内存分析器显示每个给定类型(例如Int32[]或字符串)的内存,但似乎不允许更精细的粒度显示每个命名变量的内存

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

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

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

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

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

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

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

例如,考虑下面的代码:

byte[] array = new byte[1024 * 1024]; // 1MB
byte[] array2 = array;
byte[] array3 = array;
这里我们有三个变量,都指向同一个数组。您所需的工具会显示每个工具占用多少内存?1MB,因为每个都引用1MB阵列?这会让人困惑,因为尽管实际使用的内存只有1MB,但显示的总内存将是3MB。0.3333MB?当然更令人困惑。1MB?有点准确,但没有帮助

你应该把注意力集中在哪些对象比你想要的活得更长上,然后找出是什么让这些对象活下来的


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

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