Windows用GetProcessMemoryInfo获取WorkingSetSize(物理内存占用),Linux读/proc/self/status解析VmRSS;跨平台禁用mallinfo/malloc_stats,因其不涵盖mmap等内存且不可移植。
Windows 下用 GetProcessMemoryInfo 获取当前进程内存占用
这是最直接、开销最小的方式,适用于 Windows 平台的实时监控。你需要链接 psapi.lib,并包含 。
关键点在于使用 PROCESS_MEMORY_COUNTERS 结构体中的 WorkingSetSize(工作集大小,近似“物理内存占用”)或 PagefileUsage(页文件占用,反映总虚拟内存压力)。
-
WorkingSetSize更贴近用户感知的“占了多少内存”,但会受系统内存管理策略影响(如共享页、硬错误抖动) - 必须用
GetCurrentProcess()获取句柄,且该句柄默认有PROCESS_QUERY_INFORMATION权限 - 调用前建议先调用一次
GetProcessMemoryInfo检查返回值,失败时常见原因是权限不足或结构体cb字段未正确初始化
PROCESS_MEMORY_COUNTERS pmc;
pmc.cb = sizeof(pmc);
if (GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof(pmc))) {
size_t kb = pmc.WorkingSetSize / 1024;
// kb 即当前工作集大小(KB)
}
Linux 下读取 /proc/self/status 解析 VmRSS 和 VmSize
Linux 没有统一 API,标准做法是读取 /proc/self/status 文件并按行匹配关键词。这是稳定、无需额外权限、被几乎所有监控工具采用的方式。
VmRSS(Resident Set Size)对应物理内存实际占用,和 Windows 的 WorkingSetSize 最接近;VmSize 是虚拟地址空间总大小,含 mmap、stack、heap 等,但不含 swap。
立即学习“C++免费学习笔记(深入)”;