【问题标题】:Get physical memory usage in megabytes获取以兆字节为单位的物理内存使用情况
【发布时间】:2012-11-07 08:39:24
【问题描述】:

我正在寻找以 MB 为单位的当前物理内存使用量。类似于任务管理器中的东西

我目前正在使用PerformanceCounter("Memory", "Available MBytes", true);,但它也包括页面文件(我相信),这不是我想要的。我还想要获得已用内存而不是可用内存的选项。

我正在处理的应用程序将监控物理内存使用情况,直到达到所需的阈值。然后它将重新启动一些Windows服务。

如果你好奇我为什么要开发这样一个程序。我们的一些程序在服务器上存在内存泄漏,我们必须重新启动 Windows 服务以释放内存,直到我们解决所有内存泄漏,我正在制作这个应用程序以帮助保持服务器正常运行和响应。

【问题讨论】:

    标签: c# memory monitoring


    【解决方案1】:

    使用PerformanceCounter class,可以获得PF Usage详情:

    PerformanceCounter pageCounter = new PerformanceCounter
                ("Paging File", "% Usage", "_Total", machineName);
    

    您可以在这里找到所有类别信息,Process Object。

    已添加,您还可以使用PerformanceCounter获取可用内存详细信息:

    PerformanceCounter ramCounter = PerformanceCounter
                ("Memory", "Available MBytes", String.Empty, machineName);
    

    使用PerformanceCounter,NextValue()方法可以得到MB中的可用内存值,稍后你可以将它与阈值值进行比较来停止所需的 Windows 服务。

    if (ramCounter.NextValue() > thresholdValue)
    {
        // ... Stop Desired Services
    }
    

    参考:A Simple Performance Counter Application

    【讨论】:

    • 我目前正在使用PerformanceCounter ramCounter = new PerformanceCounter("Memory", "Available MBytes", String.Empty, machineName);,但这并没有给我使用的物理内存,只有可用的内存。它似乎包含页面文件,这是我不想要的。
    • 您实际上需要使用new PerformanceCounter("Paging File", "% Usage", "_Total", machineName); 而不是检查可用内存。由于您需要 PF Usage 详细信息,因此请尝试使用 PerformanceCounter 类。
    • 是的,我能理解你说的是真的。但是,如果我们在服务器上有 6GB 的内存,并且阈值设置为 4.5GB,这意味着我必须设置我的应用程序,以检查何时有 1.5GB 可用,它不会启动进程重启windows服务,当TM显示内存为4.5GB时?
    • 为此,您需要检查可用内存而不是 PF 使用情况,new PerformanceCounter("Memory", "Available MBytes", String.Empty, machineName).NextValue();。该值将以 MB 为单位,稍后您可以将其转换为 GB,然后将其与阈值进行比较。
    • 所以我看到我需要使用PerformanceCounter("Memory", "Available MBytes", String.Empty, machineName) 我看到我的计算可能是错误的,从已用内存到可用内存。在您的服务器上有 6GB,并不意味着您将拥有 6000MB,而更像是 6143MB。所以它没有启动windows服务的重启过程,因为它还有几个MB要走,根据阈值。你能改变你的答案,这样我就可以让它成为正确的答案。
    【解决方案2】:

    我个人会使用 Win32 API GlobalMemoryStatusEx 通过 P/Invoke 调用。

    您可以在这里找到更多详细信息:- http://www.pinvoke.net/default.aspx/kernel32.globalmemorystatusex

    【讨论】:

      【解决方案3】:

      如果您不介意调用内核函数。执行此操作的 c++ 代码是:

       MEMORYSTATUSEX statex;
       statex.dwLength = sizeof (statex);
       GlobalMemoryStatusEx (&statex);
      

      在 codeproject 上,您可以了解如何从 c# 调用内核函数:

      http://www.codeproject.com/Articles/1285/Calling-API-functions-using-C

      【讨论】:

      猜你喜欢
      • 2017-05-17
      • 1970-01-01
      • 2010-10-05
      • 2012-02-17
      • 1970-01-01
      • 2010-12-12
      • 2010-10-08
      • 1970-01-01
      • 2011-11-30
      相关资源
      最近更新 更多