【问题标题】:How to measure .net app memory usage without allocating memory?如何在不分配内存的情况下测量 .net 应用程序内存使用情况?
【发布时间】:2015-12-02 10:59:05
【问题描述】:

我正在使用对性能敏感的 WPF 应用程序,并且希望每秒注销我的应用程序的一些关键内存使用统计信息。我的总体目标是通过确保我的应用程序在运行时不会分配(太多)内存来尽可能避免垃圾收集的惩罚。

关于如何通过性能计数器或当前进程的 VirtualMemorySize64 获取此信息的信息很多。

我的问题是,VS2013 分析器告诉我这些调用本身会导致大量内存分配。

仅获取“Private Bytes”性能计数器的 RawValue 会导致在几秒钟内分配近 3MB,并为调用 VirtualMemorySize64 分配另外近 3MB。

有没有更高效的方法来获取这些数字?

【问题讨论】:

  • 运行其他进程以收集统计信息。
  • 这不是一个坏主意,但似乎重量级。您为什么不重新创建该评论作为答案,以防它最终成为最佳主意,以便其他人发表评论?

标签: .net wpf performance memory


【解决方案1】:

运行其他进程以收集统计信息。

    public static void CollectStatInfo(int pid)
    {
        var memorySize = Process.GetProcessById(pid).PrivateMemorySize64;
    }

    static void Main(string[] args)
    {
        switch (args.FirstOrDefault())
        {
            case "--collect-stat-info":
                var pid = int.Parse(args.ElementAtOrDefault(1));
                CollectStatInfo(pid);
                return;
        }

        CollectStatInfoFromOtherProcess();

        //code
    }
    public static void CollectStatInfoFromOtherProcess()
    {
        Process.Start(new ProcessStartInfo()
            {
                Arguments = $"--collect-stat-info {Process.GetCurrentProcess().Id}",
                FileName = Assembly.GetExecutingAssembly().Location
            }
        );
    }

【讨论】:

  • 这显示了如何让可执行文件以命令行参数启动自己。这根本无法回答“如何分析我的应用程序的内存使用情况”这个问题。
  • @CodeCaster 这是对“如何在不测量代码的情况下分析我的应用程序的内存使用情况”问题的回答
  • 不,你添加了很多代码,只是启动了当前进程的另一个实例,传递了旧实例的 PID。在编辑之前,这就是它所做的一切;现在它调用PrivateMemorySize64 OP 提到有问题。这肯定不是你想要每秒都做的事情。
  • @CodeCaster 在当前进程中调用PrivateMemorySize64时存在问题,在其他进程中调用PrivateMemorySize64时没有问题。
  • 如果在主题应用程序启动时启动监控进程,并使用进程间通信要求它进行测量,这可能不是一个坏主意。仍然感觉重量级。
【解决方案2】:

你为什么不使用:

 My.Computer.Info.AvailablePhysicalMemory
 My.Computer.Info.AvailableVirtualMemory
 My.Computer.Info.TotalPhysicalMemory
 My.Computer.Info.TotalVirtualMemory

这些函数不需要任何内存开销。

我想您不需要如此精细地监控您的内存(如私有字节、工作集等)和垃圾收集可以帮助您以一种很好的方式控制这种使用。

【讨论】:

  • 我正在尝试监控我自己的应用程序的内存使用情况,而这些统计数据是针对整个计算机的。
  • 我猜你可以在 LOAD 事件的第一行获取它们并保存它们以查看应用程序的运行情况。主要问题不是您的程序在启动时如何分配内存,而是它在执行期间分配了多少 - 使用它们您的代码/时间/执行惩罚将尽可能低。其他方法可以显示粒度,但会消耗更多 CPU、内存,有时还需要管理员权限。
  • 这比没用还糟糕,如果机器上发生了其他事情(例如病毒扫描),它很容易给出错误的结果
  • 你是对的,当然。但是无论如何,如果您有任何其他进程消耗内存,您将无法执行操作。我的意思是,我了解您的问题与您的应用程序的可用/可用内存有关,而不是与它消耗的内存量有关。在我的应用程序中,我担心在执行一些繁重的例程之前我有多少全局可用内存。无论如何,对不起,如果我不能帮助你。
  • 我明白你在说什么,如果这是我的目标,那将是实现它的合理方式。但是,我试图确保我的应用程序在其稳定状态下分配尽可能少的内存,因为我想尽可能避免垃圾收集的惩罚。我会更新我的问题以使其更清楚。
猜你喜欢
  • 2012-08-12
  • 2011-02-27
  • 1970-01-01
  • 2016-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多