<p>GlobalMemoryStatusEx 的 dwMemoryLoad 仅近似百分比,精确值需用 (ullTotalPhys - ullAvailPhys) * 100 / ullTotalPhys 计算;务必初始化 dwLength = sizeof(MEMORYSTATUSEX),采样间隔建议 500ms。</p>

Windows 下用 GlobalMemoryStatusEx 获取实时物理内存使用率
Windows 没有直接返回“百分比”的 API,必须自己算:dwMemoryLoad 字段其实是整数百分比(0–100),但仅近似;更准的做法是用 ullTotalPhys 和 ullAvailPhys 手动计算:(ullTotalPhys - ullAvailPhys) * 100 / ullTotalPhys。注意:该值每调用一次才更新一次,不是自动刷新的流式数据。
常见错误是忽略结构体初始化——MEMORYSTATUSEX 的 dwLength 必须设为 sizeof(MEMORYSTATUSEX),否则 GlobalMemoryStatusEx 返回 false 且不填数据。
-
ullAvailPhys是当前空闲字节数,包含 standby 和 zero 页面,比任务管理器显示略高(因它过滤了部分缓存) - 建议每 500ms 采样一次,太频繁(如 10ms)会增加内核调用开销,且 Windows 自身采样周期约 1s,高频无意义
- 不要用
GetPerformanceInfo替代——它返回的是分页/非分页池等内核内存,和物理内存无关
Linux 下读 /proc/meminfo 解析 MemTotal: 和 MemAvailable:
MemAvailable: 是 Linux 4.5+ 引入的关键字段,它比 MemFree: 更真实反映可立即分配的内存(已扣减 page cache 中可回收部分)。用它算百分比才是用户感知最接近的:(MemTotal - MemAvailable) * 100 / MemTotal。
容易踩的坑是直接 parse MemFree:——在桌面或容器场景下,它常低于 100MB,但系统完全不卡,因为大量 cache 可被快速回收;此时算出的“98% 使用率”纯属误导。
立即学习“C++免费学习笔记(深入)”;
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 每行结尾有空格或 tab?用
std::istringstream+>>自动跳过空白,别用substr硬切 - 文件需每次
open()/read()/close(),不要mmap或长期 hold fd——/proc/meminfo是动态伪文件,内容随读取实时生成 - 如果目标环境是旧内核(MemAvailable: 不存在,退化用
MemFree + Buffers + Cached近似,但误差可能达 10%+
C++ 绘制动态走势图表:用 sfml 或 imgui 做轻量级实时曲线
不需要 Qt 或 matplotlib-cpp 这类重型依赖。对内存监控这种单数据流场景,sfml::VertexArray 画折线足够:维护一个长度为 N 的 std::vector<float></float> 存百分比历史值,每帧 pop_front + push_back,然后映射到屏幕坐标重绘。
关键不是“怎么画”,而是“怎么避免卡顿”:图形更新和采样必须分离线程。采样线程 sleep 精确间隔(std::this_thread::sleep_for),图形线程只负责消费最新快照——否则一旦绘制稍慢,采样就会堆积或丢帧。
- 历史点数量建议设为 300(对应 2.5 分钟 @ 2Hz),再大内存占用上升,且人眼无法分辨细节
- X 轴时间刻度别硬写“秒”,用相对帧数更稳——避免因绘制延迟导致时间轴拉伸变形
- 如果嵌入终端,可用
ncurses+ ASCII 曲线,但注意终端宽度限制,每行最多 100–120 字符,需做横向压缩采样
跨平台封装时绕开 std::system 和 shell 命令
别用 std::system("free -m | awk 'NR==2{print $3/$2*100}'") 这类方式——不可靠、启动慢、输出格式易变(不同 locale 下小数点可能是逗号)、还带安全风险(命令注入)。C++ 就该直读系统接口。
真正跨平台的写法是条件编译 + 抽象接口:
class MemoryMonitor {
public:
virtual float getUsagePercent() = 0;
#ifdef _WIN32
// 实现 GlobalMemoryStatusEx
#elif __linux__
// 实现 /proc/meminfo 解析
#endif
};复杂点在于 macOS:它没有 /proc,得调 host_statistics + HOST_VM_INFO64,返回的是 pages 数,要乘 vm_page_size 才转字节,而且 vm_pages_free 不含压缩内存(iOS/macOS 的 compressed memory 不计入 free),所以实际可用内存比这个值高。

















