Windows可用PDH查询“MemoryPeak Commit Charge”获取系统级内存峰值;Linux需周期采样/proc/meminfo计算MemTotal-MemAvailable并维护最大值;C++可跨平台通过RSS轮询+本地变量推导进程峰值;Windows还可调用GetPerformanceInfo或WMI查询Win32_OperatingSystem.PeakVirtualSize。

一、使用Windows API获取物理内存占用峰值
Windows平台提供Performance Data Helper(PDH)接口和GetProcessMemoryInfo等API,可直接读取系统级内存使用峰值数据。PDH支持查询“\Memory\Peak Commit Charge”计数器,该值反映自系统启动以来提交内存的最大值,单位为字节。
1、包含头文件:#include
2、调用PdhOpenQuery(NULL, 0, &hQuery)初始化查询句柄。
3、调用PdhAddCounter(hQuery, L"\Memory\Peak Commit Charge", 0, &hCounter)添加内存峰值计数器。
4、执行PdhCollectQueryData(hQuery)刷新一次数据。
5、调用PdhGetFormattedCounterValue(hCounter, PDH_FMT_LONG, NULL, &value)获取格式化后的峰值数值。
6、使用PdhCloseQuery(hQuery)释放资源。
二、通过/proc/meminfo解析Linux系统内存峰值
Linux内核在/proc/meminfo中不直接暴露“历史峰值”,但可通过持续采样/proc/meminfo中的MemTotal与MemAvailable差值(即已用内存估算值),结合外部记录逻辑实现峰值捕获。实际部署时需配合守护进程周期性读取并比对。
1、以只读方式打开文件:int fd = open("/proc/meminfo", O_RDONLY);
2、使用read()读取全部内容至缓冲区,确保缓冲区长度不小于1024字节。
3、逐行扫描缓冲区,匹配以"MemTotal:"和"MemAvailable:"开头的行。
4、调用sscanf()从对应行提取kb单位数值,计算当前已用内存 = MemTotal - MemAvailable。
5、将该值与全局变量记录的max_used_bytes比较,若更大则更新max_used_bytes。
6、关闭fd并休眠指定毫秒(如500ms)后进入下一轮采样循环。
三、调用C++标准库跨平台获取瞬时内存用量(辅助峰值推导)
虽然C++标准库无直接获取峰值的接口,但可通过std::this_thread::sleep_for配合重复调用平台特定接口(如Windows的GetProcessMemoryInfo或Linux的getrusage),在应用内部维持一个运行时最大值变量,实现轻量级峰值监控。
1、声明静态变量:static size_t peak_rss_bytes = 0;
2、在每次采样点调用平台适配函数获取当前RSS(Resident Set Size)值。
3、将返回值与peak_rss_bytes比较,若当前RSS更大,则执行peak_rss_bytes = current_rss;
4、对外提供只读访问接口,例如inline size_t get_peak_rss() { return peak_rss_bytes; }
5、确保所有采样操作位于同一线程或加锁保护共享变量peak_rss_bytes。
四、使用GetPerformanceInfo获取Windows系统级内存统计
Windows提供GetPerformanceInfo函数,可一次性获取包括CommitLimit、CommitTotal及PhysicalTotal在内的多项内存指标。其中CommitTotal表示当前已提交内存总量,虽非峰值,但配合定时轮询与本地最大值缓存,可构建准实时峰值监控链路。
1、定义PERFORMANCE_INFORMATION结构体实例perfInfo,并初始化为零。
2、调用GetPerformanceInfo(&perfInfo, sizeof(PERFORMANCE_INFORMATION))获取当前性能信息。
3、检查返回值是否为TRUE,且perfInfo.CommitTotal > 0。
4、将perfInfo.CommitTotal * perfInfo.PageSize转换为字节数,作为当前提交内存值。
5、与本地维护的max_commit_bytes变量比较并更新。
6、每10秒调用一次该流程,确保低开销高频采集。
五、注入WMI查询Win32_OperatingSystem类获取PeakVirtualSize
WMI(Windows Management Instrumentation)提供Win32_OperatingSystem类,其PeakVirtualSize属性表示系统自启动以来虚拟内存使用峰值,该值可通过COM接口在C++中异步查询,适用于需要与系统级监控工具对齐的场景。
1、初始化COM库:CoInitializeEx(NULL, COINIT_MULTITHREADED);
2、连接WMI服务:CoCreateInstance()创建IWbemLocator,再调用ConnectServer()连接ROOTCIMV2命名空间。
3、设置安全上下文:调用SetSecurityBlanket()配置身份验证级别。
4、执行WQL查询:L"SELECT PeakVirtualSize FROM Win32_OperatingSystem"。
5、遍历返回的IWbemClassObject结果集,调用Get(L"PeakVirtualSize", 0, &vtValue, 0, 0)提取数值。
6、将vtValue.ulVal转换为KB单位,乘以1024得到字节数,并参与峰值判定逻辑。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











