Windows用GlobalMemoryStatusEx轮询计算峰值,Linux解析/proc/meminfo或/proc/PID/status的VmHWM字段,跨平台调用sysconf接口并缓存最大值,也可集成libprocps库动态统计。

一、使用Windows API获取物理内存占用峰值
Windows平台提供Performance Data Helper(PDH)接口和GetPerformanceInfo等系统调用,可直接读取内核维护的内存峰值数据。该方法无需管理员权限,实时性强,适用于桌面应用与服务进程。
1、包含头文件
2、调用GlobalMemoryStatusEx函数填充MEMORYSTATUSEX结构体,其中ullTotalPhys字段表示总物理内存,ullAvailPhys表示当前可用内存。
3、通过调用NtQuerySystemInformation(需ntdll.lib)并传入SystemProcessInformation参数,遍历所有进程工作集,累加后与全局内存状态比对,推导历史最高使用量。
4、若需精确峰值,持续轮询GlobalMemoryStatusEx并在每次获取后更新最大值变量:ullMaxUsed = max(ullMaxUsed, ullTotalPhys - memstat.ullAvailPhys)。
二、解析/proc/meminfo实现Linux内存峰值监控
Linux系统将内存统计信息以文本形式暴露在/proc/meminfo中,其中MemTotal、MemFree、MemAvailable及Cached等字段可用于计算已用内存;而峰值需由用户态程序自行跟踪记录。
1、以只读方式打开/proc/meminfo文件。
2、逐行读取并匹配MemTotal:与MemFree:字段,提取数值(单位为kB)。
3、计算当前已用内存:MemUsed = MemTotal - MemFree。
4、在循环采集逻辑中维护一个全局变量记录历史最大值:peak_kb = std::max(peak_kb, current_used_kb)。
5、为减少I/O开销,可使用mmap映射/proc/meminfo文件,或改用get_phys_pages()与get_avphys_pages()系统调用快速估算。
三、跨平台封装类调用sysconf接口估算内存使用趋势
POSIX标准定义了sysconf(_SC_PHYS_PAGES)和sysconf(_SC_AVPHYS_PAGES),可用于获取物理页总数与当前可用页数,具备良好移植性,但不提供历史峰值,需配合外部缓存机制。
1、调用sysconf(_SC_PAGESIZE)获取系统页面大小。
2、调用sysconf(_SC_PHYS_PAGES)获取总物理页数,乘以页面大小得总内存字节数。
3、调用sysconf(_SC_AVPHYS_PAGES)获取当前可用物理页数,计算已用内存。
4、在主监控循环中每秒采样一次,并更新峰值变量:if (used_bytes > peak_bytes) peak_bytes = used_bytes。
5、注意该接口在部分容器环境(如Docker未挂载cgroup v1 memory.stat)下返回宿主机值,需额外校验/proc/cgroups或/sys/fs/cgroup/memory/目录存在性。
四、基于C++17 std::filesystem与/proc/PID/status解析单进程内存峰值
每个进程的/proc/[pid]/status文件包含VmHWM(High Water Mark)字段,直接反映该进程生命周期内的物理内存使用峰值(单位为kB),是诊断内存泄漏的关键指标。
1、构造路径字符串/proc/ + std::to_string(getpid()) + /status。
2、使用std::ifstream打开该文件,按行搜索以"VmHWM:"开头的行。
3、跳过前缀与空白字符,提取后续数字字段并转换为整型。
4、将结果乘以1024转换为字节单位:peak_bytes = hwm_kb * 1024ULL。
5、若需监控其他进程,需确保当前进程具有读取目标/proc/[pid]/status的权限(通常要求同用户或root)。
五、集成libprocps库获取动态内存峰值统计
libprocps是Linux上成熟的进程与系统信息库,其提供的proc_meminfo()函数可结构化解析/proc/meminfo,避免手动文本解析错误,且支持多版本内核字段兼容。
1、安装libprocps-dev(Debian/Ubuntu)或procps-ng-devel(RHEL/CentOS)。
2、包含
3、声明struct sysinfo sinfo;调用sysinfo(&sinfo),其中sinfo.totalram与sinfo.freeram可计算当前使用量。
4、创建定时器线程,每500ms调用一次proc_meminfo(),从返回的proc_meminfo_t结构中读取MEMINFO_MEMTOTAL与MEMINFO_MEMFREE。
5、在采集循环中持续更新:peak_kb = std::max(peak_kb, total_kb - free_kb)。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











