Linux下用/proc/self/statm读取虚拟内存大小最直接,第一列是总虚拟内存页数,乘以sysconf(_SC_PAGESIZE)得字节数,即top中的VIRT值,包含代码、数据、栈、共享库及mmap等全部虚拟地址空间。

Linux下用/proc/self/statm读取虚拟内存大小
Linux最直接的方式是解析/proc/self/statm,它第一列就是进程的总虚拟内存页数(单位是页),乘以系统页大小即可得到字节数。注意这不是RSS,而是VIRT(即top里VIRT列的值)。
实操建议:
- 用
sysconf(_SC_PAGESIZE)获取当前页大小,不要硬编码4096——某些ARM或RISC-V系统页大小可能不同 -
/proc/self/statm每行固定7个字段,第一列是size(总程序大小,含代码、数据、栈、共享库、mmap等),直接读取即可 - 避免频繁打开读取:该文件是内核实时生成的伪文件,无缓存开销,但频繁调用仍会触发系统调用,高频监控建议每秒最多1–2次
- 示例片段:
long page_size = sysconf(_SC_PAGESIZE);<br>std::ifstream f("/proc/self/statm");<br>long size_in_pages;<br>f >> size_in_pages;<br>size_t virt_bytes = static_cast<size_t>(size_in_pages) * page_size;</size_t>
macOS用task_info获取virtual_size
macOS没有/proc,必须走Mach API。核心是调用task_info并传入TASK_BASIC_INFO_64,其中virtual_size字段即为虚拟内存字节数(注意不是resident_size)。
实操建议:
- 需包含
和,链接-framework CoreServices(实际只需-lmach,但Xcode常需显式加-framework Foundation防符号冲突) - 返回值为
kern_return_t,必须检查是否等于KERN_SUCCESS;常见错误KERN_INVALID_ARGUMENT多因task_for_pid权限被禁(macOS 10.15+默认拒绝非root调试权限) - 务必用
TASK_BASIC_INFO_64_COUNT作为count参数,否则32位结构体在64位进程下会越界读取 - 示例关键段:
struct task_basic_info_64 tinfo;<br>mach_msg_type_number_t count = TASK_BASIC_INFO_64_COUNT;<br>kern_return_t kr = task_info(mach_task_self(), TASK_BASIC_INFO_64,<br> (task_info_t)&tinfo, &count);<br>if (kr == KERN_SUCCESS) {<br> size_t virt_bytes = tinfo.virtual_size;<br>}
Windows用GetProcessMemoryInfo的PagefileUsage
Windows没有“虚拟内存大小”的精确等价概念,GetProcessMemoryInfo返回的PROCESS_MEMORY_COUNTERS_EX::PagefileUsage最接近:它表示进程当前承诺的页面文件空间总量(含已提交未使用的虚拟地址空间),和top的VIRT语义基本一致。
实操建议:
- 必须使用
PROCESS_MEMORY_COUNTERS_EX结构体(而非旧版PROCESS_MEMORY_COUNTERS),否则PagefileUsage字段不存在 - 调用前需启用
SE_DEBUG_NAME权限(尤其在非管理员进程查自己时),否则可能返回0或失败——多数情况下查自身可跳过,但若进程被沙盒或低完整性级别运行,仍需OpenProcessToken+AdjustTokenPrivileges -
PagefileUsage单位是字节,无需换算;但它不包含未提交的保留区(VirtualAlloc(MEM_RESERVE)但未MEM_COMMIT的部分),这部分空间在Windows里不算“已使用”,而Linux/proc/self/statm会统计 - 示例简写:
PROCESS_MEMORY_COUNTERS_EX pmc;<br>pmc.cb = sizeof(pmc);<br>if (GetProcessMemoryInfo(GetCurrentProcess(), (PPROCESS_MEMORY_COUNTERS)&pmc, sizeof(pmc))) {<br> size_t virt_bytes = pmc.PagefileUsage;<br>}
跨平台封装要注意的三个断裂点
看似只是“读一个数字”,但各平台语义差异导致封装极易出错。最容易被忽略的是:
- Linux
/proc/self/statm的size包含所有mmap区域(含MAP_ANONYMOUS、MAP_SHARED),而WindowsPagefileUsage只计已提交部分;若程序大量调用mmap(MAP_NORESERVE),两者数值可能差数GB - macOS的
virtual_size包含所有vm_map_entry,但会排除某些内核私有映射(如dyld shared cache的只读段),实测比Linux同进程低10–20MB - 所有平台的值都**不含内核态分配的内存**(如驱动分配的DMA缓冲区、socket接收队列等),这类内存不会出现在用户态API中——如果监控目标是“进程总资源占用”,必须另加
/proc/[pid]/maps解析或vmmap工具辅助
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











