windows 无直接api获取页面交换文件使用率,需用getperformanceinfo的committotal/commitlimit比值估算内存压力;linux可从/proc/meminfo读取swaptotal和swapfree精确计算;macos无固定swap概念,仅能通过sysctl vm.swapusage有限获取。

Windows 下用 GetPerformanceInfo 获取页面交换文件使用率
Windows 没有直接暴露“页面交换文件使用率”的 API,但 GetPerformanceInfo 返回的 PERFORMANCE_INFORMATION 结构体里包含 CommitTotal 和 CommitLimit,这两个值分别代表当前已提交的虚拟内存总量和系统允许的最大提交量(即页交换文件限额 + 物理内存),它们的比值就是页面交换文件“压力率”——实际使用中这个比值常被当作系统内存压力指标,也间接反映页交换文件的占用倾向。
注意:CommitTotal 不是页交换文件独占用量,而是整个虚拟内存提交量;CommitLimit 通常 ≈ 物理内存 + 所有启用的分页文件大小之和。所以严格意义上的“页交换文件使用率”无法直接获取,只能通过差值估算:
-
CommitTotal - PhysicalMemory是理论上可能落到页交换文件上的部分(但实际未必全写入) - 若
CommitTotal >= CommitLimit,系统已接近或触发内存不足(OUTOFMEMORY或触发WM_MEMORYCHANGE) - 调用前需链接
psapi.lib,并确保进程有SE_INCREASE_QUOTA_NAME权限(一般默认有)
Linux 下读取 /proc/meminfo 中的 SwapTotal 和 SwapFree
Linux 更直接:页交换文件(swap)的限额和使用情况就明文写在 /proc/meminfo 里。关键字段是 SwapTotal(总 swap 大小,单位 kB)和 SwapFree(空闲 swap 大小),两者相减即为已用 swap,再做除法就能算出使用率。
实操时注意:
- 必须以文本方式读取
/proc/meminfo,不能依赖固定行号——不同内核版本字段顺序可能变化 - 推荐逐行扫描,匹配以
SwapTotal:和SwapFree:开头的行,提取冒号后首个数字(跳过空格和单位) - 某些系统启用了 zram 或 zswap,它们也会出现在
/proc/meminfo中(如Zswap:),但不属于传统磁盘 swap,不应计入 - 如果
SwapTotal == 0,说明未启用 swap,此时使用率无意义,应返回-1或明确标识 “swap disabled”
C++ 跨平台封装时绕不开的权限与精度陷阱
Windows 和 Linux 的数据来源本质不同:Windows 给的是虚拟内存提交边界,Linux 给的是磁盘 swap 实际分配状态。强行统一成“页面交换文件使用率”会误导——比如 Windows 上 CommitTotal / CommitLimit 达到 95% 时,swap 文件本身可能只用了 20%,但系统已濒临 OOM;而 Linux 上 swap 使用率 95% 却未必影响响应,只要 MemAvailable 充足。
因此封装时建议:
- 不提供单一函数名如
getSwapUsagePercent(),而是分设getSystemCommitRatio()(Windows)和getSwapUsage()(Linux),避免语义混淆 - Linux 版本务必检查
fopen("/proc/meminfo", "r")是否成功——容器环境或 chroot 下该路径可能不可见 - 所有数值解析必须做
strtoul()或std::stoull()错误检查,/proc/meminfo中字段值可能为空或含非数字字符 - 不要缓存结果:这些值每秒都在变,每次调用都应重新读取
macOS 没有等价的页面交换文件概念
macOS 使用压缩内存(Compressed Memory)和动态 swap(存储在 /private/var/vm/swapfile*,由系统自动增删),没有固定的 swap 限额,也不对外暴露类似 SwapTotal 的统计项。vm_stat 命令输出的 Pages free、Pages active 等属于物理内存状态,swappages 字段早已废弃(自 macOS 10.9+ 不再更新)。
目前唯一可行路径是:
- 执行
sysctl vm.swapusage(仅部分版本支持),解析其输出中的total、used字段(单位 bytes) - 若该 sysctl 不存在或返回错误,则认为“不可获取”,不要 fallback 到
host_statistics——后者不包含 swap 使用量 - 注意:macOS 的 swap 文件是稀疏文件,
stat()查到的st_size并非实际占用空间,st_blocks * 512才接近真实磁盘用量,但系统不保证实时更新
跨平台工具若需支持 macOS,建议明确文档标注“swap 使用率仅作参考,且 macOS 下精度受限”。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











