【问题标题】:How to find out memory consumed by classes, objects, variables, etc [duplicate]如何找出类,对象,变量等消耗的内存[重复]
【发布时间】:2015-08-29 16:18:55
【问题描述】:

我正在尝试使用内存分析(第一次,所以请原谅我的无知),只是为了查看类、对象、变量、方法等消耗了多少内存。我编写了这个示例 c# 控制台程序,名为MemPlay.exe:

using System;
using System.Text;

namespace MemPlay 
{
   class Program 
   {
      static void Main(string[] args) 
      {
         SomeClass myObject = new SomeClass();

         StringNineMethod();
      }

      private static void StringNineMethod() 
      {         
         string someString0 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

         string someString1 = string.Empty;
         string someString2 = string.Empty;

         for (int i = 0; i < 9999; i++) {
            someString1 += "9";
            someString2 += someString1;
         }
      }
   }   

   class SomeClass 
   {

   }
}

程序运行后,我想知道:

消耗了多少内存

  • MemPlay.exe
  • 程序类
  • 某类
  • 主要方法
  • 我的对象
  • StringNineMethod
  • someString0
  • someString1
  • someString2

以及使用了多少处理器:

  • MemPlay.exe
  • 主要方法
  • StringNineMethod

我尝试使用 VisualStudio 的“性能诊断”工具,但我只能看到整个函数(即 Main 方法、StringNineMethod 和 String.Concat 方法)使用了多少内存。

有什么方法/工具可以帮助我查看每个变量、对象、类、方法消耗多少内存的所有详细信息?提前致谢。

编辑:不,我的问题与建议的问题不重复,因为该问题试图在运行时获取对象大小,我在问如何在程序结束后获取此信息。正如 Visual Studio 的性能诊断工具所做的那样,它会在程序结束执行后提供此信息。

【问题讨论】:

  • 不,无法查看每个变量、对象、类消耗多少内存的详细信息。
  • 真的吗?您的意思是无法从 VisualStudio 性能诊断中获取此信息,或者根本无法从任何其他工具中获取此信息?
  • 我觉得根本没办法
  • 不,我的问题与建议的问题不重复,因为该问题试图在运行时获取对象大小,我在问如何在程序结束后获取此信息。就像 Visual Studio 的性能诊断工具所做的那样,它会在程序结束执行后提供此信息。
  • 为什么会被标记为重复?这个问题和问题甚至与 OPs 问题无关。这太荒谬了。

标签: c# memory-management performance-testing memory-profiling


【解决方案1】:

您可以使用System.Diagnostics 命名空间类来获取不同类型的测量和统计信息。要获得为进程分配的总内存,请使用WorkingSet 属性(更多详细信息请参见MSDN):

Process currentProcess = System.Diagnostics.Process.GetCurrentProcess();
long processAllocatedMemory = currentProcess.WorkingSet64;

这就是过程。

要获得特定的对象分配,您可能可以使用GC 检查初始内存,然后分配一个对象,最后再次检查内存:

// Check initial memory
var memoryStart = System.GC.GetTotalMemory(true);

// Allocate an object.
var myClass = new SomeClass;

// Check memory after allocation
var memoryEnd = System.GC.GetTotalMemory(true);

要在特定操作后检查特定进程的内存消耗,您可能可以使用与 GC 相同的技巧,仅对当前进程(如第一个示例)。

要检查可执行文件和程序,请使用 Visual Studio 分析器。在 VS2013 Community Edition 中,转到 ANALYZE -> Performance and Diagnostics 菜单(或点击 Alt+F2)。它允许您分析标准项目、exe、ASP.NET 网站和 Windows Phone 应用程序:

在那里,您选择性能向导,单击开始,然后在下一步中您可以选择要运行的指标。其中之一是内存消耗:

【讨论】:

    【解决方案2】:

    我用这个: RedGate ANTS

    我过去也用过这个: SciTech Memory Profiler

    他们都有免费试用,值得一看。我在不同时期都印象深刻,以至于购买了这两个版本。

    (我不为任何一家公司工作 - 只是推荐对我有用的东西 - 还有其他工具,例如 JetBrains Memory Profiler,但我没有亲自尝试过,无法提供意见)。

    【讨论】:

      猜你喜欢
      • 2020-02-12
      • 1970-01-01
      • 2016-08-30
      • 1970-01-01
      • 1970-01-01
      • 2013-01-17
      • 2014-02-16
      • 1970-01-01
      • 2011-05-06
      相关资源
      最近更新 更多