当前位置: 首页
编程语言
C++如何获取当前进程的虚拟内存大小 _ 平台特定API调用方法【实战】

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

热心网友 时间: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。

同类文章
更多
php日志在哪查看

php日志在哪查看

PHP日志文件位置查找全攻略:服务器配置与查看方法详解 1 定位PHP错误日志文件路径 PHP错误日志是排查程序问题的首要信息来源,其存储位置主要由服务器配置决定。掌握正确的查找方法至关重要。 核心配置文件定位:首先需要找到PHP的主配置文件php ini。在该文件中搜索error_log配置项,

时间:2026-05-05 07:33
php内存限制怎么调

php内存限制怎么调

PHP内存限制调整全攻略:解决“内存耗尽”错误的专业方法 当您运行数据密集型任务或复杂PHP应用时,是否频繁遭遇“Allowed memory size exhausted”致命错误?这明确提示当前PHP内存配额不足。高效调整内存限制是每位开发者的必备技能,其核心操作仅需修改一个关键配置参数。 第一

时间:2026-05-05 07:15
centos php如何自定义配置文件

centos php如何自定义配置文件

在CentOS系统中自定义PHP配置文件 想要在CentOS服务器上根据项目需求个性化配置PHP运行环境?自定义PHP配置文件是实现这一目标的灵活且安全的方法。它允许您在不改动系统默认设置的前提下,独立调整PHP参数,确保环境隔离与稳定性。本指南将详细介绍在CentOS系统上自定义PHP配置文件的完

时间:2026-05-05 07:15
centos php如何恢复数据

centos php如何恢复数据

CentOS系统下PHP数据恢复的几种可行路径 在CentOS服务器上部署的PHP应用若遭遇数据丢失,确实会引发严重关切。但请保持冷静,在多数情况下,通过正确的方法,数据是可以被成功找回的。首要原则是立即停止向相关磁盘或目录进行任何写入操作,以防止新数据覆盖原有信息,从而最大化恢复可能性。随后,可根

时间:2026-05-05 07:14
centos php错误日志在哪看

centos php错误日志在哪看

在CentOS系统中定位PHP错误日志的几种方法 排查PHP程序故障时,错误日志是至关重要的诊断依据。然而在CentOS服务器环境中,日志文件的存储位置并非固定,主要取决于PHP的安装方式与运行配置。本文将系统性地介绍几种高效定位PHP错误日志的实用方法,帮助您快速找到问题根源。 1 从源头入手:

时间:2026-05-05 07:14
热门专题
更多
刀塔传奇破解版无限钻石下载大全 刀塔传奇破解版无限钻石下载大全
洛克王国正式正版手游下载安装大全 洛克王国正式正版手游下载安装大全
思美人手游下载专区 思美人手游下载专区
好玩的阿拉德之怒游戏下载合集 好玩的阿拉德之怒游戏下载合集
不思议迷宫手游下载合集 不思议迷宫手游下载合集
百宝袋汉化组游戏最新合集 百宝袋汉化组游戏最新合集
jsk游戏合集30款游戏大全 jsk游戏合集30款游戏大全
宾果消消消原版下载大全 宾果消消消原版下载大全
  • 日榜
  • 周榜
  • 月榜
热门教程
更多
  • 游戏攻略
  • 安卓教程
  • 苹果教程
  • 电脑教程