C++如何获取系统空闲内存 _ GlobalMemoryStatusEx接口【实战】

雨枫大大_5257

雨枫大大_5257

2026-04-13

176人浏览

原创

globalmemorystatusex返回的ullavailphys不准,因其包含可立即回收的standby内存,而任务管理器“可用内存”已扣除该部分;需结合getperformanceinfo或性能计数器模拟其逻辑。

c++如何获取系统空闲内存 _ globalmemorystatusex接口【实战】

为什么 GlobalMemoryStatusEx 返回的空闲内存不准?

直接调用 GlobalMemoryStatusEx 获取 ullAvailPhys 字段,常发现数值远高于任务管理器显示的“可用内存”。这不是接口坏了,而是 Windows 对“可用(Available)”的定义和用户直觉不一致:ullAvailPhys 包含已缓存但可立即回收的内存(如 Standby List),而任务管理器的“可用”还扣除了这部分——它更接近 ullAvailPhys - ullStandbyPageCount * 4096 的估算值。实际开发中若用于资源调度判断(比如是否启动新进程),只看 ullAvailPhys 容易误判。

实操建议:

  • 不要把 ullAvailPhys 当作“还能分配多少 MB 物理内存”的精确上限
  • 若需模拟任务管理器逻辑,需额外调用 GetPerformanceInfo 或解析 \Memory\Standby Cache Reserve Pages 性能计数器(后者需 PDH API)
  • 对大多数应用,ullAvailPhys > 512 * 1024 * 1024(512MB)即可认为内存充足;低于 128MB 才真正值得干预

如何正确调用 GlobalMemoryStatusEx 避免崩溃或返回失败?

该函数要求传入的 MEMORYSTATUSEX 结构体必须预先设置 dwLength 字段,否则在旧版 Windows(如 Win7)上会直接返回 FALSE 且 GetLastError() 为 ERROR_INVALID_PARAMETER。这是最常踩的坑。

正确写法(C++):

MEMORYSTATUSEX memInfo;
memInfo.dwLength = sizeof(MEMORYSTATUSEX); // 必须!不能省略
if (GlobalMemoryStatusEx(&memInfo)) {
    ULONGLONG freeBytes = memInfo.ullAvailPhys;
    // 使用 freeBytes...
}

其他要点:

C++ Code Review Master
C++ Code Review Master

组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。

下载
  • 结构体必须用 ZeroMemory 或 {0} 初始化,避免未初始化字段干扰
  • 编译时确保定义了 _WIN32_WINNT ≥ 0x0501(即 XP SP2+),否则链接会失败
  • 该函数是线程安全的,无需加锁,但频繁调用(如每毫秒)会影响性能——建议缓存 1–2 秒

ullAvailPhys 和 ullAvailVirtual 到底该看哪个?

两者完全不是一回事:ullAvailPhys 是当前可立即分配的物理内存字节数(单位字节),而 ullAvailVirtual 是当前进程可用的虚拟地址空间剩余量(同样单位字节)。32 位进程虚拟地址空间上限约 2GB(用户态),即使物理内存有 16GB,ullAvailVirtual 也可能只剩几 MB——这时 new 或 VirtualAlloc 失败,跟物理内存是否空闲无关。

典型场景判断:

  • 担心 OOM 崩溃?优先看 ullAvailPhys,尤其当它持续低于 100MB
  • 频繁 malloc 失败但 Task Manager 显示内存充足?检查 ullAvailVirtual,很可能是地址空间碎片化或泄露
  • 64 位程序基本不用管 ullAvailVirtual,除非手动 VirtualAlloc 大量区域且未释放

有没有比 GlobalMemoryStatusEx 更准的替代方案?

没有“更准”的通用接口,只有“更贴近你需求”的选择。Windows 本身不对外暴露 Standby/Modified 页面的实时精确值,GlobalMemoryStatusEx 已是官方推荐的轻量级方案。若真需要任务管理器级精度:

  • 用 PdhOpenQuery + PdhAddCounter 读取 \Memory\Available MBytes 计数器(注意:单位是 MB,非字节,且有 1 秒延迟)
  • 调用 NtQuerySystemInformation(未公开 API),传入 SystemPerformanceInformation,解析 StandbyPageCount 等字段——但需 ntdll.lib 链接,且微软不保证兼容性
  • 对服务类程序,可考虑 WMI 查询 Win32_OperatingSystem 的 FreePhysicalMemory 属性,但开销大、延迟高

绝大多数桌面或后台应用,老老实实用 GlobalMemoryStatusEx,并接受它的语义边界就够了。硬要抠那几百 MB 的差异,反而容易引入不稳定依赖。

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

相关文章

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

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

下载

相关标签:

c++

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

相关专题

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

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

2025.06.09

4414

18

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

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

2025.07.04

4571

25

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

2023.10.19

3108

3

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

2025.10.17

4649

12

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2025.12.29

3729

9

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

2026.01.19

426

15

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

2023.08.10

3938

6

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

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

2023.07.26

3159

3

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

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

2023.07.27

2718

6

热门下载

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

精品课程

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

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

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

共0课时 | 0人学习