讲师中心 微信公众号

工具推荐

视频效率加速
剧云
剧云

中文短剧剧本制作平台

Laper
Laper

剧本策划到成片协作

立刻MV
立刻MV

低成本歌曲 MV、视频生成

Seko
Seko

AI短剧一键生成成片

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

陌伟酱_3589

陌伟酱_3589

发布时间:2026-04-10 22:36:04

|

181人浏览过

|

来源于php中文网

原创

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 要求显式告知结构体大小,并支持未来扩展字段。

立即学习“C++免费学习笔记(深入)”;

正确写法:

C++14
C++14

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

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

关键点:

  • {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

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

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

码上飞
码上飞 Hot

一款基于自然语言的AI应用开发平台,可根据用户描述自动生成应用程序,帮助个人和团队快速完成应用原型与开发。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

超级麦吉

一款通过数字员工协作完成调研、数据分析与文档制作的AI办公平台。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

相关专题

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

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

580

2023.10.17

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

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

876

2023.10.18

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

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

1986

2025.08.19

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

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

5434

2025.06.09

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

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

5591

2025.07.04

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

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

3479

2023.07.26

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

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

3018

2023.07.27

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

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

1548

2023.08.01

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

20

2026.11.12

热门下载

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

精品课程

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

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

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

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn