C++如何获取系统内存占用百分比 _ GlobalMemoryStatusEx用法【实战】

陌伟酱_3589

陌伟酱_3589

2026-04-10

181人浏览

原创

GlobalMemoryStatusEx 返回的内存百分比不准,是因为自行计算 (dwTotalPhys - dwAvailPhys) / dwTotalPhys × 100 会误将 Standby 等可回收内存计入“已用”,而任务管理器和系统真实负载感知依据的是 ullMemoryLoad 字段(0–100),该值由内核综合多个内存列表状态实时估算,与界面显示一致,应直接使用而非自行推算。

c++如何获取系统内存占用百分比 _ globalmemorystatusex用法【实战】

为什么 GlobalMemoryStatusEx 返回的内存百分比不准?

直接调用 GlobalMemoryStatusEx 后用 (dwTotalPhys - dwAvailPhys) / dwTotalPhys * 100 算百分比,结果常偏高(比如显示 95%,但任务管理器只显示 72%)。这是因为 Windows 的“可用物理内存”dwAvailPhys 不等于“未被使用的内存”——它排除了被系统缓存(Standby List)、驱动锁定页、Session 内存等非活动但可回收的内存。任务管理器显示的是“已提交内存 / 提交限制”,更贴近实际压力感知。

真正反映系统负载倾向的指标,是 ullMemoryLoad 字段:它是内核计算出的综合负载值(0–100),已考虑 Standby、Modified、Free 等多个内存列表状态,和任务管理器底部的“内存使用率”数值基本一致。

实操建议:

  • 别自己算百分比,直接读 MEMORYSTATUSEX.ullMemoryLoad
  • 确保结构体 dwLength 正确初始化为 sizeof(MEMORYSTATUSEX),否则函数返回 FALSE 且不填充数据
  • 该函数在 Windows XP SP2+ 可用,但 Win10/11 下仍推荐使用,兼容性好且开销极低

GlobalMemoryStatusEx 必须初始化的三个字段

常见错误是只声明 MEMORYSTATUSEX ms; 就调用,导致返回 FALSE 或数据全零。Windows 要求显式告知结构体大小,并支持未来扩展字段。

正确写法:

MEMORYSTATUSEX ms = {0};
ms.dwLength = sizeof(MEMORYSTATUSEX); // 必须!
if (GlobalMemoryStatusEx(&ms)) {
    DWORD percent = ms.ullMemoryLoad; // 0–100,直接可用
}

关键点:

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
  • {0} 初始化确保所有字段清零,避免未定义值干扰
  • dwLength 必须在调用前赋值,不能依赖编译器默认或后续修改
  • 返回 FALSE 时不要忽略,应检查是否因结构体版本不匹配或权限问题失败(极少见,但需防御)

和 GetPerformanceInfo、WMI 比有什么区别?

如果你看到别人用 GetPerformanceInfo 或 WMI 查询 Win32_OperatingSystem 的 PercentUsedMemory,要注意它们不是同一维度:

  • GlobalMemoryStatusEx:用户态轻量调用,毫秒级延迟,ullMemoryLoad 是内核实时估算值,适合每秒轮询
  • GetPerformanceInfo:需 psapi.lib,返回的 CommitLimit 和 CommitTotal 更偏向虚拟内存压力,对物理内存占用感知较弱
  • WMI:跨进程、跨机器友好,但首次查询慢(>100ms),频繁调用易触发 COM 初始化开销和权限弹窗

除非你要做长期监控平台或需要历史趋势聚合,否则单机实时获取内存占用,GlobalMemoryStatusEx 是最稳的选择。

64 位程序下 ullTotalPhys 和 ullAvailPhys 的单位是字节,但别用它们算百分比

这两个字段确实是 64 位无符号整数,能准确表示超过 4GB 的内存总量与可用量。但正如前面所说,用它们相减再除会误把 Standby 缓存当成“已用内存”。例如某机器有 32GB 物理内存,Standby 占 8GB,ullAvailPhys 可能只有 2GB,算出来就是 94%,而实际应用可立即使用的内存远不止这些。

所以:

  • 保留 ullTotalPhys 用于显示总内存(如 “32.0 GB”),格式化时除以 1024.0 * 1024 * 1024
  • 保留 ullAvailPhys 仅作参考(比如判断是否低于阈值触发告警),不参与百分比计算
  • 唯一可信的百分比来源,始终是 ullMemoryLoad

这个字段设计初衷就是解决“人眼看到的内存压力”和“机器统计的已分配页”之间的语义鸿沟——它藏得不深,但容易被跳过。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
session失效的原因
session失效的原因

session失效的原因有会话超时、会话数量限制、会话完整性检查、服务器重启、浏览器或设备问题等等。详细介绍:1、会话超时:服务器为Session设置了一个默认的超时时间,当用户在一段时间内没有与服务器交互时,Session将自动失效;2、会话数量限制:服务器为每个用户的Session数量设置了一个限制,当用户创建的Session数量超过这个限制时,最新的会覆盖最早的等等。

2023.10.17

580

4

session失效解决方法
session失效解决方法

session失效通常是由于 session 的生存时间过期或者服务器关闭导致的。其解决办法:1、延长session的生存时间;2、使用持久化存储;3、使用cookie;4、异步更新session;5、使用会话管理中间件。

2023.10.18

876

5

cookie与session的区别
cookie与session的区别

本专题整合了cookie与session的区别和使用方法等相关内容,阅读专题下面的文章了解更详细的内容。

2025.08.19

1986

14

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

2025.06.09

5414

18

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

2025.07.04

5591

25

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.26

3479

3

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.07.27

3018

6

windows照片无法显示
windows照片无法显示

当我们尝试打开一张图片时,可能会出现一个错误提示,提示说"Windows照片查看器无法显示此图片,因为计算机上的可用内存不足",本专题为大家提供windows照片无法显示相关的文章,帮助大家解决该问题。

2023.08.01

1548

3

windows查看端口被占用的情况
windows查看端口被占用的情况

windows查看端口被占用的情况的方法:1、使用Windows自带的资源监视器;2、使用命令提示符查看端口信息;3、使用任务管理器查看占用端口的进程。本专题为大家提供windows查看端口被占用的情况的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

2739

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习