Linux下获取当前进程虚拟内存大小是否有更优雅的方法?
Linux下获取当前进程虚拟内存大小的更优雅实现
在Linux系统中,确实有比逐行解析/proc/self/status更简洁优雅的方式,以下是几种可行方案:
1. 解析/proc/self/stat文件
/proc/self/stat包含进程核心统计信息,其中第23个字段(从1开始计数)就是虚拟内存大小(vsize),单位为字节。这种方式无需逐行匹配关键字,直接定位字段即可,代码更简洁:
#include <stdio.h> #include <stdint.h> uint64_t get_process_vsize() { uint64_t vsize = 0; FILE* stat_file = fopen("/proc/self/stat", "r"); if (stat_file) { // 跳过前22个字段,读取第23个字段(vsize) fscanf(stat_file, "%*d %*s %*c %*d %*d %*d %*d %*d %*u %*u %*u %*u %*u %*u %*u %*d %*d %*d %*d %*d %*d %*u %lu", &vsize); fclose(stat_file); } return vsize; }
2. 优化版/proc/self/status解析
如果仍倾向于使用/proc/self/status,可以优化解析逻辑,直接匹配VmSize关键字,避免无意义的逐行遍历:
#include <stdio.h> #include <stdint.h> uint64_t get_process_vsize_from_status() { uint64_t vsize = 0; FILE* status_file = fopen("/proc/self/status", "r"); if (status_file) { char line[256]; while (fgets(line, sizeof(line), status_file)) { if (sscanf(line, "VmSize: %lu kB", &vsize) == 1) { vsize *= 1024; // 转换为字节 break; } } fclose(status_file); } return vsize; }
补充说明
- 以上方案均无需依赖第三方库,基于标准C和Linux原生接口实现,轻量且兼容性强,覆盖几乎所有主流Linux发行版。
- 注意:
getrusage系统调用仅能获取驻留集大小(物理内存占用),无法直接获取虚拟内存,若仅需物理内存统计,可使用该系统调用,但不符合虚拟内存的需求场景。
内容的提问来源于stack exchange,提问作者feeling_lonely
相关产品推荐
相关产品推荐

