在 C++ 中实时获取程序占用的内存量

作者: , 共 903 字

获取程序占用的内存量,是一个诡异的需求。但程序写多了,有时候还真需要,尤其是代码运行出现问题的时候。

1. 实现代码

下面代码在 ubuntu 18.04 下通过。代码仅依赖 Linux 的内核功能,理论上适用于大部分 Linux 发行版。

// 实时获取程序占用的内存,单位:kb。
size_t physical_memory_used_by_process()
{
    FILE* file = fopen("/proc/self/status", "r");
    int result = -1;
    char line[128];

    while (fgets(line, 128, file) != nullptr) {
        if (strncmp(line, "VmRSS:", 6) == 0) {
            int len = strlen(line);

            const char* p = line;
            for (; std::isdigit(*p) == false; ++p) {}

            line[len - 3] = 0;
            result = atoi(p);

            break;
        }
    }

    fclose(file);

    return result;
}

注意,该程序读取的是程序占用的物理内存,也就是系统实际在物理内存上分配给程序的内存。程序申请,但没有读写过的地址空间,不一定对应了物理内存(操作系统很聪明)。长时间不用的内存,也可以被移出物理内存,移入虚拟内存。

2. 解释

代码很简单,它依赖了 Linux 的/proc/self/status文件。这个并不是一个真实存在的文件,而为 Linux 的一个内核接口。它里面提供了当前线程的很多信息,包括了内存占用量,具体可参考Linux Programmer's Manual

Q. E. D.

类似文章:
一个好用的 C++性能分析工具需满足几个条件:
C++内存检查和性能分析工具 valgrind里介绍了 valgrind 的安装,以及用于效率分析 profiler 工具。valgrind 最本来的功能是内存检查。这篇文章做简单的介绍。
相似度: 0.121
编程 » C++, 算法
一个短小、高效的 C++函数,用来判断指定日期是星期几:
http://senlinzhan.github.io/2017/12/04/cpp-memory-order/ 写得最浅显易懂。记录一下以备查询。
相似度: 0.087
编程 » C++
C++的浮点数转整数有四种方法,直接类型转换、round、floor、ceil。其效果如下表:
相似度: 0.082
armadillo是一个线性代数 C++库,封装了blaslapack,提供更直观的接口。
没有人敢说 Matlab 的帮助文件不够详细和全面,但 Matlab 里面的确存在一些功能和函数,你很难找到它的帮助文档。下面列举一些,以后碰到其它的也会放到这里来:
编程 » Linux, rsync
在同步一个超大文件时,发现 rsync 并没有按照预期的同步一个文件。而使用md5sum检验文件内容时,原始文件和目标文件的内容并不一样。
编程 » Linux, Vim, 文件编码
由于 UNICODE 的优势,目前推荐都用 UTF-8 进行编码。
一个烦心事情是 pypyodbc 查询到的中文结果都显示为问号乱码,下面的代码可以解决这个问题。但会导致无法正常获取查询结果的字段名称(curser.description结果异常)。由于修改了 sys 全局设置,目前不清楚是否还有其它副作用。
今天刚看了《疯狂的外星人》。电影片头说原著是《乡村教师》。但整个电影,除了出现外星人之外,和《乡村教师》一点关系都没有。
【流浪地球】(《科幻世界》杂志 2000 年 7 月第 7 期)。作者:刘慈欣。