可通过平台特定接口获取进程物理内存占用峰值:Linux读/proc/self/status的VmHWM字段,macOS调task_info()的resident_size_max,Windows用GetProcessMemoryInfo()的PeakWorkingSetSize,跨平台可条件编译封装。

如果您需要在 C++ 程序中获取当前进程运行期间所达到的物理内存占用峰值(即历史最高驻留集大小 RSS),该值反映进程生命周期内实际使用物理内存的最大瞬时值,不同操作系统提供不同的接口机制。以下是适用于主流平台的多种实现方法:
一、Linux 平台:读取 /proc/self/status
Linux 内核通过 /proc 文件系统向用户空间暴露进程统计信息,其中 VmHWM 字段(Hierarchical Virtual Memory High Water Mark)记录了自进程启动以来 RSS 的峰值(单位为 KB)。该值在进程生命周期内单调递增,仅当进程主动调用 madvise(MADV_DONTNEED) 或内核回收页时可能被重置,但通常可稳定读取。
1、打开 /proc/self/status 文件,以只读方式访问。
2、逐行扫描文件内容,定位包含 "VmHWM:" 前缀的行。
3、跳过前缀与空白字符,提取后续数字字符串。
4、调用 std::stoi 或 std::strtol 将其转换为整型数值。
5、将结果乘以 1024 得到以字节为单位的峰值物理内存占用值。
二、macOS 平台:调用 task_info() 获取 resident_size_max
macOS 提供 Mach API 接口 task_info(),配合 TASK_BASIC_INFO_64 扩展结构体,可获取进程的 resident_size_max 字段,该字段明确表示自任务创建以来最大常驻内存大小(单位为字节),无需单位换算且语义清晰。
1、包含
2、调用 mach_task_self() 获取当前任务端口。
3、声明 task_basic_info_64 tbi 结构体变量并初始化为零。
4、调用 task_info(),传入 TASK_BASIC_INFO_64_COUNT 作为 count 参数。
5、检查返回值是否为 KERN_SUCCESS,若成功则读取 tbi.resident_size_max 成员。
三、Windows 平台:调用 GetProcessMemoryInfo() 获取 PeakWorkingSetSize
Windows 提供 PSAPI 函数 GetProcessMemoryInfo(),其输出参数 PROCESS_MEMORY_COUNTERS 结构体中的 PeakWorkingSetSize 字段,表示进程自创建以来工作集(即物理内存中驻留的页面总数)达到的最大字节数,该值与 Linux 的 VmHWM 及 macOS 的 resident_size_max 具有直接对应关系。
1、包含
2、调用 GetCurrentProcess() 获取当前进程句柄。
3、声明 PROCESS_MEMORY_COUNTERS pmc 结构体变量。
4、调用 GetProcessMemoryInfo(),传入进程句柄、&pmc 和 sizeof(pmc)。
5、若函数返回 TRUE,则从 pmc.PeakWorkingSetSize 字段中读取峰值物理内存字节数。
四、跨平台封装:基于编译宏条件编译
为统一调用接口,可在头文件中定义 inline 函数 get_peak_physical_memory_bytes(),依据预定义宏 __linux__、__APPLE__、_WIN32 分支选择对应平台实现,避免运行时判断开销,确保各平台逻辑独立编译且无符号冲突。
1、在函数声明前添加 #ifdef __linux__ 分支块,内含 /proc/self/status 解析逻辑。
2、在 #elif defined(__APPLE__) 分支中实现 Mach task_info 调用流程。
3、在 #elif defined(_WIN32) 分支中实现 GetProcessMemoryInfo 调用流程。
4、每个分支末尾均 return 对应平台获取的字节数值。
5、所有分支外添加 #else #error "Unsupported platform for peak physical memory query" 防御性提示。
五、精度与时机注意事项
物理内存峰值并非实时连续更新,其采样受内核调度与内存管理策略影响;例如 Linux 中 VmHWM 仅在内核更新 RSS 时同步刷新,两次刷新之间若发生大量内存分配与释放,峰值可能滞后于实际瞬时最大值;因此应在关键内存操作路径后立即调用获取函数,而非依赖周期性轮询。此外,多线程环境下该值反映整个进程视图,无法区分线程粒度的内存峰值。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











