windows无直接获取物理内存占用峰值的api,需通过持续采样getprocessmemoryinfo(用process_memory_counters_ex的privateusage字段)或globalmemorystatusex自行维护最大值,peakworkingsetsize字段不可靠。

Windows 上没有直接返回“物理内存占用峰值”的现成 API,GetProcessMemoryInfo 和 GlobalMemoryStatusEx 都只提供当前快照,不记录历史最高值。真正的峰值监控必须靠持续采样 + 自行维护最大值。
Windows 下用 GetProcessMemoryInfo 监控本进程内存峰值
这是最常用也最容易上手的方式:获取当前进程的私有工作集(Private Working Set)大小,并在运行中不断更新最大值。
-
PROCESS_MEMORY_COUNTERS_EX结构比旧版PROCESS_MEMORY_COUNTERS更准确,尤其对大内存进程,务必启用PROCESS_QUERY_LIMITED_INFORMATION权限(Win8+ 推荐) - 关键字段是
PrivateUsage(单位字节),它反映本进程独占的物理内存,比WorkingSetSize更能体现真实内存压力 - 不要依赖
PeakWorkingSetSize字段——它在多数 Windows 版本中不更新或恒为 0,属于已知失效字段
PROCESS_MEMORY_COUNTERS_EX pmc = {0};
pmc.cb = sizeof(pmc);
if (GetProcessMemoryInfo(GetCurrentProcess(), (PPROCESS_MEMORY_COUNTERS)&pmc, sizeof(pmc))) {
static SIZE_T peak = 0;
peak = std::max(peak, pmc.PrivateUsage);
printf("Current: %zu KB, Peak: %zu KB\n", pmc.PrivateUsage / 1024, peak / 1024);
}
全系统物理内存峰值只能靠轮询 GlobalMemoryStatusEx + 自行记录
系统级“已用物理内存峰值”不存在于内核公开接口中。你看到的任务管理器里那个“峰值”其实是 UI 层自己缓存并更新的,底层仍基于 GlobalMemoryStatusEx 的实时采样。
-
MEMORYSTATUSEX中的ullTotalPhys - ullAvailPhys给出当前已用物理内存,但无历史记录 - 若需模拟系统峰值,必须在主循环中定期调用(如每 500ms),并用
std::max更新本地变量 - 注意:高频率轮询(
跨平台方案?Linux 没有等价接口,得读 /proc/meminfo 和 /proc/[pid]/status
Linux 下没有类似 Windows 的统一内存信息 API,所有数据都来自 procfs 文件,且“峰值”概念更模糊——内核不保存历史最大值,只能靠应用层解析文本后自行追踪。
- 系统总内存使用:读取
/proc/meminfo中的MemTotal:和MemAvailable:,差值即当前已用(近似) - 本进程峰值:解析
/proc/self/status中的VmHWM:字段(单位 KB),它是内核记录的该进程生命周期内的最高驻留集大小(RSS) - 注意:
VmHWM是只读累计值,进程退出后即丢失;重启后需重新初始化监控逻辑 - 不要误用
VmPeak(虚拟地址空间峰值),它和物理内存无关
真正难的不是采集,而是定义清楚“峰值”到底指什么:是本进程的私有内存最高点?还是整个系统的可用内存最低点?不同场景下指标含义完全不同,而所有操作系统都只提供瞬时值——峰值永远是应用层的责任,不是内核的义务。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











