4

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

在此处输入图像描述

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

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

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

4

3 回答 3

6

使用PerformanceCounter 类,您可以获得PF 使用详情:

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
}

参考:一个简单的性能计数器应用程序

于 2012-11-19T12:19:20.720 回答
2

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

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

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

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

于 2012-11-19T12:17:09.767 回答
1

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

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

于 2012-11-19T12:24:32.943 回答