linux下用/proc/self/statm读取第二列rss页数最轻量,需结合getpagesize()换算字节数;windows下必须用getprocessmemoryinfo获取workingsetsize,不可用已废弃的getworkingsetsize。

Linux 下用 /proc/self/statm 读取 RSS 页面数最轻量
Linux 内核通过 /proc/self/statm 暴露进程内存快照,其中第二列就是当前驻留物理内存的页数(RSS),单位是 getpagesize() 返回的系统页大小(通常是 4096 字节)。它不触发任何内核态扫描,开销极低,适合高频采样。
实操建议:
- 用
std::ifstream打开/proc/self/statm,读取整行后按空格分割,取第二个字段 - 务必调用
getpagesize()获取真实页大小,不要硬编码 4096 —— 某些 ARM 或大页配置下可能不同 - 注意该值是近似值:内核只在页表遍历时更新,且不包含共享内存中被其他进程引用的页(即“独占 RSS”偏保守)
- 示例片段:
long rss_pages = 0; std::ifstream f("/proc/self/statm"); if (f >> std::skipws >> std::ignore >> rss_pages) { size_t page_size = getpagesize(); size_t rss_bytes = static_cast<size_t>(rss_pages) * page_size; }</size_t>
Windows 下必须用 GetProcessMemoryInfo,别碰 GetWorkingSetSize
GetWorkingSetSize 是旧 API,早已废弃,返回值不可靠;正确方式是链接 psapi.lib,调用 GetProcessMemoryInfo 并读取其输出结构体中的 WorkingSetSize 字段——这才是 Windows 的 RSS 定义(当前映射到物理内存的字节数)。
实操建议:
- 需包含头文件
<psapi.h></psapi.h>,并在项目中链接psapi.lib(MSVC)或-lpsapi(MinGW) - 调用前确保进程有
PROCESS_QUERY_INFORMATION权限,通常默认具备,但沙盒或服务进程可能受限 -
WorkingSetSize是近似值:Windows 不实时维护精确 RSS,该值由内存管理器周期性估算,延迟约几秒 - 示例关键行:
PROCESS_MEMORY_COUNTERS pmc; if (GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof(pmc))) { size_t rss_bytes = pmc.WorkingSetSize; }
跨平台封装要注意 size_t 和符号性陷阱
Linux 的 /proc/self/statm 返回的是无符号长整型页数,Windows 的 WorkingSetSize 是 SIZE_T(即 size_t),但某些老旧代码会误用 int 或 long 存储,导致 4GB+ 内存时溢出为负数或截断。
实操建议:
- 统一用
size_t接收和传递 RSS 字节数,避免中间转int、long或unsigned long - 在 C++17 及以上,可用
std::filesystem::exists("/proc/self/statm")判断 Linux 环境,比宏定义更可靠 - 不要试图把 RSS 值直接 printf 输出:用
%zu格式符,否则在 32 位环境或跨编译器时易错
别把 RSS 当成“真实内存占用”,它不反映页面换入/换出状态
RSS 只告诉你此刻有多少页在物理内存里,但完全不体现这些页是否刚被换入、是否马上要被换出、是否被锁定(mlock)、是否属于匿名映射还是文件映射。例如一个刚从 swap 换入的大数组,RSS 瞬间飙升,但实际带宽压力已在上一秒发生。
真正需要定位内存瓶颈时:
- Linux 下配合
/proc/self/smaps查看RssAnon、RssFile、Swap等细分项 - Windows 下用
QueryWorkingSetEx可获取每页的换入/换出/锁定状态,但性能代价高,仅调试用 - 如果看到 RSS 波动剧烈但应用无明显卡顿,大概率是内核在后台做页面回收,不一定代表问题
实际部署时,多数人只想要一个稳定、低开销的 RSS 近似值——/proc/self/statm 和 GetProcessMemoryInfo 就是各自平台最接近这个目标的接口。其余细节,得看你要解决的具体问题是什么。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











