如何获取 C# 中的总物理内存?

Posted

技术标签:

【中文标题】如何获取 C# 中的总物理内存?【英文标题】:How can I get the total physical memory in C#? 【发布时间】:2010-12-05 22:00:21 【问题描述】:

我正在使用GlobalMemoryStatusEx 函数来检索有关内存的信息,但是该函数无法正常工作。它为所有属性返回 0。我认为此功能不适用于我的 Windows 7 环境。

    [StructLayout(LayoutKind.Sequential)]
    internal struct MEMORYSTATUSEX
    
        internal uint dwLength;
        internal uint dwMemoryLoad;
        internal ulong ullTotalPhys;
        internal ulong ullAvailPhys;
        internal ulong ullTotalPageFile;
        internal ulong ullAvailPageFile;
        internal ulong ullTotalVirtual;
        internal ulong ullAvailVirtual;
        internal ulong ullAvailExtendedVirtual;
    
    [return: MarshalAs(UnmanagedType.Bool)]
    [DllImport("Kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    internal static extern bool GlobalMemoryStatusEx(ref MEMORYSTATUSEX lpBuffer);

    private void btnGlobalMemoryStatusEX_Click(object sender, EventArgs e)
    
        MEMORYSTATUSEX statEX = new MEMORYSTATUSEX();
        GlobalMemoryStatusEx(ref statEX);

        double d = (double)statEX.ullTotalPhys;
    

谁能告诉我我的代码哪里出错了?

【问题讨论】:

你试过WMI吗?它速度较慢,但​​必须适用于所有操作系统。 【参考方案1】:

你可以使用这个模板:

long memory = Process.GetCurrentProcess().PeakVirtualMemorySize64;

还有另一个名称为 Peak*64 的属性

【讨论】:

我相信 OP 是在询问物理内存,所以 Process 没那么有用。【参考方案2】:

怎么样:

My.Computer.Info.TotalPhysicalMemory
My.Computer.Info.AvailablePhysicalMemory

【讨论】:

坦克,但我用 C#.Net 编写。 @Amir:添加对 Microsoft.VisualBasic.dll 的引用。 @Amir,抱歉,我总是忘记 My-Namespace 在 C# 中“本机”不存在。 :( @Amir:您仍然可以访问该属性:添加对“Microsoft.VisualBasic”的引用,然后创建Microsoft.VisualBasic.Devices.ComputerInfo 类型的实例。这对应于@Bobby 的答案中的My.Computer.Info 我这样做了,我得到了负的“垃圾”值。带有 8GB 内存的 Windows 64【参考方案3】:

如果是c#,你可以:

引用Microsoft.VisualBasic 程序集。 然后导入Microsoft.VisualBasic.Devices命名空间。 最后使用 ComputerInfo 获取总物理内存。

int bytesPerMebibyte = (1 << 20);  // http://physics.nist.gov/cuu/Units/binary.html
ComputerInfo myCompInfo = new ComputerInfo();
string physicalMemory = "Physical Memory: "
    + (myCompInfo.TotalPhysicalMemory / bytesPerMebibyte) + " MB";

【讨论】:

无法在 .NET Core 中工作,因为 VB 尚未实现。【参考方案4】:

我发现我的错误来自: http://www.pinvoke.net/default.aspx/kernel32/GlobalMemoryStatusEx.html

我变了

internal static extern bool GlobalMemoryStatusEx(ref MEMORYSTATUSEX lpBuffer);

static extern bool GlobalMemoryStatusEx([In, Out] MEMORYSTATUSEX lpBuffer);

改变了

GlobalMemoryStatusEx(ref statEX);

GlobalMemoryStatusEx(statEX);

它工作正常。 坦克

【讨论】:

你是如何得到这份工作的。我在 VS 中以管理员身份在管理员帐户上运行此代码。当我调用 GlobalMemoryStatusEX() 时,我收到一个异常消息: System.AccessViolationException HResult=0x80004003 Message=Attempted to read or write protected memory。这通常表明其他内存已损坏。【参考方案5】:

您在调用GlobalMemoryStatusEx 之前忘记设置statEX.dwLength

MEMORYSTATUSEX statEX = new MEMORYSTATUSEX();
statEX.dwLength = (uint)Marshal.SizeOf(typeof(MEMORYSTATUSEX));
GlobalMemoryStatusEx(ref statEX);

【讨论】:

好的,我们应该设置它,但主要问题是“ref”关键字。您应该将其从功能的删除和使用中删除。 @dalle: 仅供参考,因为 MEMORYSTATUSEX 函数是非托管的,您可以直接使用 sizeof(MEMORYSTATUSEX),而无需调用互操作帮助程序(元帅)。

以上是关于如何获取 C# 中的总物理内存?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Windows 7 中获取缓存和释放的物理内存量?

Linux如何获取进程在物理内存中的所有内容?当进程在内存中的内容发生变化时,又如何获知?内核中实现

如何找到分配给redis实例的内存?

在 Solaris 中查找进程的物理内存详细信息的命令

windows 物理内存获取

linux 下如何查看服务器物理内存状况