Windows用GetProcessMemoryInfo获取PeakWorkingSetSize,Linux解析/proc/self/status的VmHWM,macOS调用task_info获取resident_size_max,POSIX用getrusage的ru_maxrss(单位依平台而异),容器环境可用cgroup v2的memory.max_usage_in_bytes。

如果您需要在C++程序中实时获取系统当前物理内存占用的峰值(即自进程启动以来达到过的最高物理内存使用量),则需依赖操作系统提供的特定接口,不同平台实现机制差异显著。以下是针对主流操作系统的多种获取方法:
一、Windows平台:使用GetProcessMemoryInfo API
该方法通过调用psapi.dll中的GetProcessMemoryInfo函数,读取PROCESS_MEMORY_COUNTERS结构体中的PeakWorkingSetSize字段,该值代表进程自创建以来工作集大小的历史最大值(单位为字节),可近似反映物理内存峰值占用。
1、在源文件顶部包含必要头文件:#include
2、链接psapi.lib库,在项目设置中添加或在代码中加入#pragma comment(lib, "psapi.lib");
立即学习“C++免费学习笔记(深入)”;
3、声明PROCESS_MEMORY_COUNTERS结构体变量,并调用GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof(pmc));
4、检查返回值是否为TRUE,若成功则读取pmc.PeakWorkingSetSize字段;
5、将结果除以1024转换为KB,或除以1024/1024转换为MB进行展示。
二、Linux平台:解析/proc/self/status文件
Linux内核通过/proc伪文件系统向用户空间暴露进程统计信息,其中VmHWM(High Water Mark)字段记录了进程生命周期内驻留集(RSS)所达到的最大值(单位为KB),该值与物理内存峰值占用高度一致。
1、使用std::ifstream打开/proc/self/status路径;
2、逐行读取文件内容,查找以“VmHWM:”开头的行;
3、跳过前缀与空白字符后,提取后续数字部分;
4、将提取出的数值转换为整型,此即峰值内存KB数;
5、可选地乘以1024得到字节数,用于与其他平台单位对齐。
三、macOS平台:调用task_info接口
macOS基于Darwin内核,提供Mach API中的task_info函数,配合TASK_BASIC_INFO_64结构体,可获取task resident size的历史最大值(resident_size_max字段),该字段由内核维护,反映物理内存峰值使用。
1、包含头文件:#include
2、获取当前任务端口:task_t current_task = mach_task_self();
3、声明task_basic_info_64 tbi结构体及mach_msg_type_number_t count = TASK_BASIC_INFO_64_COUNT;
4、调用task_info(current_task, TASK_BASIC_INFO_64, (task_info_t)&tbi, &count);
5、若返回KERN_SUCCESS,则tbi.resident_size_max即为物理内存峰值字节数。
四、跨平台封装:使用getrusage系统调用(POSIX兼容)
POSIX标准定义的getrusage函数在Linux、macOS及部分BSD系统中可用,其RUSAGE_SELF参数可返回当前进程资源使用统计,ru_maxrss字段表示进程曾使用的最大驻留集大小(Linux单位为KB,macOS单位为字节,需按平台区分处理)。
1、包含头文件:#include
2、声明struct rusage ru变量;
3、调用getrusage(RUSAGE_SELF, &ru);
4、读取ru.ru_maxrss字段值;
5、判断运行平台:若为Linux,值单位为KB;若为macOS,值单位为字节,需除以1024转换为KB以统一输出。
五、C++17及以上:使用std::filesystem探测/proc/meminfo(仅Linux)
对于仅需系统级物理内存峰值(而非进程级)的场景,可通过读取/proc/meminfo中MemTotal与MemFree差值估算当前占用,但该方式不提供历史峰值;而真正反映系统全局内存峰值的是内核未直接导出的指标——此时可结合/proc/stat中btime与page counters间接推算,但常规监控实践中更推荐使用cgroup v2 memory.stat(如memory.max_usage_in_bytes)接口,适用于容器化环境。
1、确认运行环境为Linux且启用cgroup v2,挂载点通常为/sys/fs/cgroup;
2、构造路径:/sys/fs/cgroup/memory.max_usage_in_bytes(若为v1则为memory.limit_in_bytes + memory.usage_in_bytes组合逻辑);
3、以只读方式打开该文件;
4、读取全部内容并转换为uint64_t整数;
5、该数值即为当前cgroup内所有进程物理内存使用峰值(字节单位)。


















