c++中如何获取程序运行过程中的内存占用_c++监控内存方法【详解】

发布时间 - 2026-01-31 00:00:00    点击率:
Linux下读取/proc/self/status的VmRSS字段(单位KB)最轻量常用,反映真实物理内存占用;Windows用GetProcessMemoryInfo获取WorkingSetSize,二者等价;避免使用mallinfo等堆内指标,因其严重低估真实内存。

Linux 下用 /proc/self/status 读取当前进程 RSS 内存

最轻量、最常用的方法是读取 /proc/self/status 文件中的 VmRSS 字段,它代表当前进程实际占用的物理内存(单位:KB)。这个值不包含 swap,也不含共享内存重复计算,适合监控真实内存压力。

注意:/proc 是 Linux 特有接口,Windows 不可用;且需确保程序有读取该文件权限(通常都有)。

  • VmRSS 值会滞后于 malloc/free 调用,因为内核按页回收,不是立即释放
  • 不要解析 VmSize(虚拟内存大小),它包含未分配的 mmap 区域和保留地址空间,不能反映真实内存压力
  • 建议每秒读取不超过 10 次,频繁读 /proc/self/status 会产生轻微 I/O 开销
FILE* f = fopen("/proc/self/status", "r");
if (f) {
    char line[256];
    while (fgets(line, sizeof(line), f)) {
        if (strncmp(line, "VmRSS:", 6) == 0) {
            long rss_kb;
  

sscanf(line, "VmRSS: %ld kB", &rss_kb); printf("RSS: %ld KB\n", rss_kb); break; } } fclose(f); }

Windows 下用 GetProcessMemoryInfo 获取工作集大小

Windows 对应方案是调用 psapi.h 中的 GetProcessMemoryInfo,读取 PROCESS_MEMORY_COUNTERS::WorkingSetSize。它等价于 Linux 的 VmRSS,即当前驻留在物理内存中的字节数。

需要链接 psapi.lib,并在项目中定义 PSAPI_VERSION 1(否则可能返回 0)。

  • WorkingSetSize 包含私有内存 + 共享内存(如系统 DLL),但不含已换出页面
  • 如果函数返回 FALSE,检查是否漏加 #pragma comment(lib, "psapi.lib") 或未启用 PSAPI_VERSION
  • 避免在多线程高频调用中反复打开/关闭当前进程句柄;复用 GetCurrentProcess() 返回的句柄即可
#include 
#include 
#pragma comment(lib, "psapi.lib")

void print_memory_usage() { PROCESS_MEMORY_COUNTERS pmc; if (GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof(pmc))) { printf("WorkingSetSize: %zu KB\n", pmc.WorkingSetSize / 1024); } }

跨平台封装时慎用 mallinfomalloc_stats

mallinfo(glibc)和 malloc_stats 输出的是堆管理器内部视图,不是 OS 看到的真实内存。它们只统计 malloc 系统调用分配的 heap 区域,忽略 mmap 分配的大块内存(如 std::vector 超过阈值后自动切到 mmap)、静态数据、栈、共享库等。

因此,这些接口容易严重低估真实内存占用,尤其在大量使用 std::stringstd::vector 或第三方库(如 protobuf、OpenCV)时。

  • mallinfo().uordblks 只反映 glibc malloc arena 中已分配但未 free 的字节数
  • malloc_stats() 输出到 stderr,无法直接捕获,且格式不固定,不适合自动化解析
  • C++17 起,std::allocator 不保证调用 malloc,部分实现走 mmapmallinfo 完全不可见

监控精度与采样频率的实际取舍

内存监控不是越细越好。高频采样(如每毫秒)本身就会增加调度开销和锁竞争(尤其是 /proc 文件读取或 Windows PSAPI 调用),反而干扰被测程序行为。

真实场景下,推荐按需分层:

  • 调试阶段:每 100–500ms 采样一次,配合关键路径打点(如函数入口/出口)
  • 线上服务:每 5–30 秒聚合一次,写入日志或上报 metrics,避免 IO 毛刺
  • OOM 分析:配合 setrlimit(RLIMIT_AS) 或 cgroup memory.max(Linux)做硬限制,比事后查 RSS 更可靠

真正难的不是“怎么读内存”,而是判断哪个值能对应你关心的问题——是防止 OOM?定位泄漏?还是优化缓存命中率?选错指标,数据再准也没用。


# linux  # windows  # 字节  # 虚拟内存  #   # c++  # win  # 内存占用  # String  # 封装  # 接口  #   # 线程  # 多线程  # opencv  # 自动化  # 句柄  # 不含  # 的是  # 最轻  # 就会  # 都有  # 尤其是  # 并在  # 线上  # 不超过 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何快速搭建高效WAP手机网站吸引移动用户?  如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南  PHP 实现电台节目表的智能时间匹配与今日/明日轮播逻辑  INTERNET浏览器怎样恢复关闭标签页_INTERNET浏览器标签恢复快捷键与方法【指南】  html5如何实现懒加载图片_ intersectionobserver api用法【教程】  Laravel如何实现API速率限制?(Rate Limiting教程)  Bootstrap整体框架之CSS12栅格系统  香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化  如何快速生成专业多端适配建站电话?  关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)  Win11摄像头无法使用怎么办_Win11相机隐私权限开启教程【详解】  如何为不同团队 ID 动态生成多个独立按钮  Laravel如何实现本地化和多语言支持?(i18n教程)  原生JS实现图片轮播切换效果  Microsoft Edge如何解决网页加载问题 Edge浏览器加载问题修复  Laravel如何配置任务调度?(Cron Job示例)  昵图网官方站入口 昵图网素材图库官网入口  java中使用zxing批量生成二维码立牌  佛山网站制作系统,佛山企业变更地址网上办理步骤?  Laravel怎么配置.env环境变量_Laravel生产环境敏感数据保护与读取【方法】  如何在 React 中条件性地遍历数组并渲染元素  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  百度输入法ai组件怎么删除 百度输入法ai组件移除工具  Laravel怎么发送邮件_Laravel Mail类SMTP配置教程  今日头条微视频如何找选题 今日头条微视频找选题技巧【指南】  Laravel Facade的原理是什么_深入理解Laravel门面及其工作机制  Laravel如何升级到最新的版本_Laravel版本升级流程与兼容性处理  微信小程序 input输入框控件详解及实例(多种示例)  个人摄影网站制作流程,摄影爱好者都去什么网站?  实例解析Array和String方法  动图在线制作网站有哪些,滑动动图图集怎么做?  标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?  实例解析angularjs的filter过滤器  网站制作软件免费下载安装,有哪些免费下载的软件网站?  如何在阿里云域名上完成建站全流程?  高端智能建站公司优选:品牌定制与SEO优化一站式服务  微信小程序 配置文件详细介绍  Laravel全局作用域是什么_Laravel Eloquent Global Scopes应用指南  详解jQuery停止动画——stop()方法的使用  香港网站服务器数量如何影响SEO优化效果?  如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?  PythonWeb开发入门教程_Flask快速构建Web应用  zabbix利用python脚本发送报警邮件的方法  Midjourney怎么调整光影效果_Midjourney光影调整方法【指南】  如何挑选最适合建站的高性能VPS主机?  如何用PHP快速搭建CMS系统?  Laravel怎么集成Log日志记录_Laravel单文件与每日日志配置及自定义通道【详解】  黑客入侵网站服务器的常见手法有哪些?  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  linux写shell需要注意的问题(必看)