首页 游戏 软件 资讯 排行榜 专题
首页
编程语言
C++如何获取当前进程的虚拟内存大小 _ 平台特定API调用方法【实战】

C++如何获取当前进程的虚拟内存大小 _ 平台特定API调用方法【实战】

热心网友
13
转载
2026-05-05

C++如何获取当前进程的虚拟内存大小:平台特定API调用方法【实战】

在Linux下,读取/proc/self/statm是获取虚拟内存大小最直接的方法。其第一列表示总虚拟内存页数,乘以sysconf(_SC_PAGESIZE)得到的字节数,就对应着top命令中的VIRT值。这个数值包含了代码、数据、栈、共享库以及所有mmap映射区域在内的全部虚拟地址空间。

C++如何获取当前进程的虚拟内存大小 _ 平台特定API调用方法【实战】

免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈

Linux下用/proc/self/statm读取虚拟内存大小

想在Linux上获取进程的虚拟内存大小?最直接、最经典的路径就是解析/proc/self/statm这个伪文件。它的第一列,也就是size字段,直接给出了进程占用的总虚拟内存页数。你只需要将这个数字乘以系统的页大小,就能得到以字节为单位的VIRT值——没错,就是tophtop命令里VIRT那一列显示的数字。

听起来简单,但实操起来有几个细节必须把握:

立即学习“C++免费学习笔记(深入)”;

  • 获取页大小要动态:务必使用sysconf(_SC_PAGESIZE)来获取系统页大小,可别想当然地硬编码4096。要知道,在一些ARM或RISC-V架构的系统上,页大小可能不同。
  • 字段固定,读取直接/proc/self/statm每行固定有7个由空格分隔的字段,第一列就是我们要的size。它统计的是整个程序映像的大小,囊括了代码段、数据段、堆栈、共享库以及所有通过mmap映射的区域。
  • 注意读取频率:虽然这个文件由内核动态生成,没有磁盘I/O开销,但每次读取依然是一次系统调用。对于需要高频监控的场景,建议将频率控制在每秒1到2次以内,避免不必要的性能损耗。
  • 核心代码片段
    long page_size = sysconf(_SC_PAGESIZE);
    std::ifstream f(“/proc/self/statm”);
    long size_in_pages;
    f >> size_in_pages;
    size_t virt_bytes = static_cast(size_in_pages) * page_size;

macOS用task_info获取virtual_size

到了macOS,事情就变得不一样了。这里没有/proc文件系统,必须通过Mach微内核的API来获取信息。核心在于调用task_info函数,并传入TASK_BASIC_INFO_64这个信息 fla vor。返回的结构体中,virtual_size字段就是我们需要的虚拟内存字节数(切记,不是resident_size)。

这个过程有几个关键点容易踩坑:

立即学习“C++免费学习笔记(深入)”;

  • 头文件与链接:需要包含。链接时,通常需要-framework CoreServices。在实际操作中,尤其是使用Xcode时,显式添加-framework Foundation可以避免一些潜在的符号冲突。
  • 错误检查不可少:返回值类型是kern_return_tKERN_SUCCESS。常见的错误KERN_INVALID_ARGUMENT,很多时候是因为task_for_pid的权限被拒绝——这在macOS 10.15 (Catalina) 及之后的版本中尤为常见,系统默认会拒绝非root进程的调试权限。
  • 确保使用64位结构体:务必使用TASK_BASIC_INFO_64_COUNT宏作为count参数传入。如果误用了32位结构体的计数,在64位进程下会导致越界读取,引发不可预知的问题。
  • 示例关键代码
    struct task_basic_info_64 tinfo;
    mach_msg_type_number_t count = TASK_BASIC_INFO_64_COUNT;
    kern_return_t kr = task_info(mach_task_self(), TASK_BASIC_INFO_64,
                                  (task_info_t)&tinfo, &count);
    if (kr == KERN_SUCCESS) {
        size_t virt_bytes = tinfo.virtual_size;
    }

Windows用GetProcessMemoryInfo的PagefileUsage

Windows平台并没有一个与Linux VIRT完全对等的概念。最接近的指标是使用GetProcessMemoryInfo函数获取PROCESS_MEMORY_COUNTERS_EX结构体,其中的PagefileUsage成员。它表示进程当前承诺使用的页面文件空间总量,包含了已提交(committed)但可能尚未被使用的虚拟地址空间,其语义与top的VIRT大致相当。

在Windows上实现时,需要特别注意以下几点:

立即学习“C++免费学习笔记(深入)”;

  • 使用正确的结构体:必须使用扩展版本PROCESS_MEMORY_COUNTERS_EX,因为基础的PROCESS_MEMORY_COUNTERS结构体不包含PagefileUsage字段。
  • 权限问题:调用前,有时需要启用SE_DEBUG_NAME权限。对于查询自身进程信息的情况,通常可以跳过。但如果你的进程运行在沙盒或低完整性级别下,可能仍然需要调用OpenProcessTokenAdjustTokenPrivileges来调整权限。
  • 理解统计范围PagefileUsage的单位直接就是字节,无需转换。但必须清楚它的统计范围:它只包含已提交(COMMIT)的内存,而不包括那些仅保留(RESERVE)而未提交的地址空间(通过VirtualAlloc with MEM_RESERVE分配的部分)。这一点与Linux的/proc/self/statm不同,后者会统计保留区域。
  • 代码示例简写
    PROCESS_MEMORY_COUNTERS_EX pmc;
    pmc.cb = sizeof(pmc);
    if (GetProcessMemoryInfo(GetCurrentProcess(), (PPROCESS_MEMORY_COUNTERS)&pmc, sizeof(pmc))) {
        size_t virt_bytes = pmc.PagefileUsage;
    }

跨平台封装要注意的三个断裂点

把各个平台的代码写出来只是第一步。当试图将它们封装成一个统一的跨平台接口时,才会遇到真正的挑战。表面上看只是“读取一个数字”,但底层语义的差异极易导致封装结果失真。以下是三个最容易被忽略的“断裂点”:

  • 统计范围的本质差异:Linux /proc/self/statmsize包含了所有mmap映射的区域(无论是匿名的还是共享的)。而Windows的PagefileUsage只计算已提交的部分。如果你的程序大量使用了mmap并设置了MAP_NORESERVE标志,那么在Linux和Windows上报告出来的“虚拟内存大小”可能会相差数GB之多。
  • macOS的特殊性:macOS的virtual_size虽然包含了所有的vm_map_entry,但会自动排除一些内核的私有映射,例如动态链接器共享缓存(dyld shared cache)的只读部分。实际测试中,同一个程序在macOS上报告的值可能比在Linux上低10到20MB。
  • 用户态视角的局限:所有平台通过用户态API获取的数值,都不包含内核态为进程分配的内存。例如,驱动程序分配的DMA缓冲区、网络栈为Socket预留的接收队列等,这些资源虽然被进程使用,但不会体现在上述API的返回值中。如果你的监控目标是评估“进程的总资源占用”,就必须借助更底层的工具,例如解析Linux的/proc/[pid]/maps或使用macOS的vmmap命令进行辅助分析。
来源:https://www.php.cn/faq/2420188.html
免责声明: 游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

相关攻略

mysql如何排查虚拟内存swap使用过高问题_调整innodb_flush_method与swappiness
数据库
mysql如何排查虚拟内存swap使用过高问题_调整innodb_flush_method与swappiness

MySQL卡但CPU低时,大概率是SWAP导致:先用vmstat 1查si so是否持续大于0,再结合free -h确认SwapUsed上涨;需设innodb_flush_method=O_DIRECT、swappiness=1、memlock无限并启用innodb_numa_interlea ve

热心网友
04.30
如何在 Win11 中修改虚拟内存位置 提升系统在大内存下的稳定性方法
系统平台
如何在 Win11 中修改虚拟内存位置 提升系统在大内存下的稳定性方法

如果你在Windows 11上运行大型软件或游戏时,频繁遇到内存不足、系统卡顿甚至报错,问题可能就出在虚拟内存(也叫页面文件)的配置上。默认情况下,它通常“蜗居”在系统盘,一旦遇到高负载场景,就可能成为性能瓶颈。将虚拟内存迁移到一块高速的非系统固态硬盘上,是提升大内存配置下系统稳定性的有效方法。下面

热心网友
04.25
如何在Windows中修改虚拟内存大小 提升大内存消耗软件运行稳定性
系统平台
如何在Windows中修改虚拟内存大小 提升大内存消耗软件运行稳定性

Photoshop内存不足?先别急着加内存,优化虚拟内存是关键 相信不少朋友都遇到过这种情况:正用Photoshop处理大图,或者用Premiere剪辑一段4K素材,软件突然卡住,紧接着弹出一个令人沮丧的提示——“内存不足”。这背后,往往不是你的物理内存真的不够,而是Windows的“虚拟内存”(也

热心网友
04.20
MacBook Neo笔记本SSD速度实测:仅为MacBook Pro的几分之一
礼仪与书信
MacBook Neo笔记本SSD速度实测:仅为MacBook Pro的几分之一

IT之家 3 月 11 日消息,科技媒体 The Verge 昨日发布博文,报道称苹果最便宜笔记本 MacBook Neo 的固态硬盘连续读写速度约为 1700 MB s,是新款 MacBook P

热心网友
03.11

最新APP

宝宝过生日
宝宝过生日
应用辅助 04-07
台球世界
台球世界
体育竞技 04-07
解绳子
解绳子
休闲益智 04-07
骑兵冲突
骑兵冲突
棋牌策略 04-07
三国真龙传
三国真龙传
角色扮演 04-07

热门推荐

[标准版]深圳经济特区商品房预售合同书
职业与学业
[标准版]深圳经济特区商品房预售合同书

《[标准版]深圳经济特区商品房预售合同书》 本文发表于2026年04月13日,欢迎访问本站的合同范本频道(https: www liuxue86 com hetongfanben )。本站为您准备了大量实用的合同范本,例如您可能感兴趣的商品房买卖合同书、深圳经济特区相关内容,以及深圳经济特区30周

热心网友
05.05
南京二手房交易合同
职业与学业
南京二手房交易合同

第1部分 合同背景 在正式进入细节之前,咱们不妨先聊聊这份合同本身。它可不只是一叠纸,而是你未来数年甚至数十年安居乐业的基石。理解它的框架和背景,是走好每一步的前提。 第2部分 房屋质量 房子结不结实,这是头等大事。这部分条款就是给你的房子做一次“全面体检”,从地基到屋顶,从主体结构到隐蔽工程,每一

热心网友
05.05
出租房屋合同的格式
职业与学业
出租房屋合同的格式

合同的内容与条款解析 合同,这个看似简单的法律文书,其内涵却因具体情境而异。简单来说,它可以从两个层面来理解:作为一份法律文件,合同的内容就是那一系列白纸黑字的条款,它们像游戏规则一样,明确了各方的权利、义务和责任;而作为一种法律关系,合同的内容则直接体现为当事人所享有的债权和所需承担的债务。这两者

热心网友
05.05
最新关于出租房屋合同范本
职业与学业
最新关于出租房屋合同范本

最新关于出租房屋合同范本 话说回来,一份清晰、规范的合同,是保障租赁双方权益的基石。今天,我们就来详细拆解一份标准的房屋租赁合同范本,看看其中有哪些关键条款需要你我共同关注。 首先,合同的订立双方必须明确: 出租方:____________(个人或单位),以下简称甲方; 承租方:__________

热心网友
05.05
标准通用技术服务合同格式
职业与学业
标准通用技术服务合同格式

签订合同这事儿,本质上是为了给交易上一道“公平锁”。无论哪一方在合作中遇到波折,只要白纸黑字签了约,双方就都有了清晰的行为准则和法律依据。这不仅能让交易过程更顺畅,往往也是达成圆满合作的关键一步。下面为大家梳理了两份实用的合同范本,供各位在需要时参考查阅。更多相关信息,欢迎关注留学网合同范本频道:w

热心网友
05.05