c++中获取进程物理内存占用峰值需按平台调用不同api:windows用getprocessmemoryinfo的peakworkingsetsize,linux解析/proc/self/status的vmhwm,macos用task_info的resident_size_max,跨平台可封装为统一函数。

如果您需要在 C++ 程序中实时获取系统当前物理内存占用的峰值(即自进程启动以来达到过的最高物理内存使用量),该值通常对应于进程的“工作集峰值”或“物理内存峰值使用量”,不同操作系统提供不同的底层接口。以下是针对主流平台的多种实现方法:
一、Windows 平台:使用 GetProcessMemoryInfo
Windows 提供了 PSAPI 中的 GetProcessMemoryInfo 函数,可读取 PROCESS_MEMORY_COUNTERS 结构体,其中 PeakWorkingSetSize 字段即为进程生命周期内物理内存占用的峰值(单位字节)。
1、包含必要头文件:#include
2、链接 psapi.lib 库,在项目设置中添加或在源码顶部加入 #pragma comment(lib, "psapi.lib")。
3、声明 PROCESS_MEMORY_COUNTERS 变量并初始化其 dwSize 成员为 sizeof(PROCESS_MEMORY_COUNTERS)。
4、调用 GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof(pmc)) 获取内存统计信息。
5、读取 pmc.PeakWorkingSetSize 即可获得物理内存峰值字节数。
二、Linux 平台:解析 /proc/self/status
Linux 通过 procfs 暴露进程运行时状态,/proc/self/status 文件中的 VmHWM(High Water Mark)字段记录了进程自启动以来物理内存使用的峰值(单位 KB)。
1、使用 std::ifstream 打开 /proc/self/status 文件。
2、逐行读取,查找以 VmHWM: 开头的行。
3、跳过前缀和空白字符后,提取后续数字部分。
4、将该数值乘以 1024 转换为字节单位。
三、macOS 平台:调用 task_info 接口
macOS 基于 Darwin 内核,需通过 Mach API 的 task_info 函数配合 TASK_BASIC_INFO_64 结构体获取物理内存峰值,其中 resident_size_max 字段表示最大常驻内存大小(单位字节)。
1、包含头文件:#include
2、声明 task_basic_info_64_data_t 结构体变量,并设置 flavor 为 TASK_BASIC_INFO_64。
3、调用 task_info(mach_task_self(), TASK_BASIC_INFO_64, (task_info_t)&tbi, &count),其中 count 初始化为 TASK_BASIC_INFO_64_COUNT。
4、检查返回值是否为 KERN_SUCCESS,若成功则读取 tbi.resident_size_max 成员。
四、跨平台封装:基于条件编译的统一接口
为避免重复判断平台,可定义统一函数 get_peak_physical_memory_bytes(),内部依据 __linux__、_WIN32、__APPLE__ 宏选择对应实现路径。
1、函数返回类型为 uint64_t,确保能容纳大于 4GB 的内存值。
2、在 Windows 分支中调用 GetProcessMemoryInfo 并返回 PeakWorkingSetSize。
3、在 Linux 分支中解析 /proc/self/status 的 VmHWM 行并转换为字节。
4、在 macOS 分支中调用 task_info 并返回 resident_size_max。
5、所有分支均应在失败时返回 0 并可选记录 errno 或 GetLastError() 值用于调试。
五、验证与调试:输出峰值并对比实时值
为确认获取值的有效性,可在程序关键节点(如大对象分配后、容器扩容后)调用峰值获取函数,并与当前工作集(WorkingSetSize / VmRSS / resident_size)对比,观察是否更新。
1、在循环中每隔 100ms 调用一次峰值获取函数并打印结果。
2、手动触发内存密集操作(例如 new char[1024*1024*100] 后不释放)。
3、观察输出值是否随操作递增,且不再回落 —— 这符合“峰值”的单调非减特性。
4、使用系统工具交叉验证:Windows 用任务管理器“峰值工作集”列;Linux 用 pmap -x PID 或 cat /proc/PID/status | grep VmHWM;macOS 用 vm_stat 或 activity monitor 的“Real Mem”峰值。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











