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

作者: , 共 902 字 , 共阅读 0

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

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.

类似文章:
相似度: 0.214
编程 » C++, 算法, 代码片段
一个短小、高效的 C++函数,用来判断指定日期是星期几:
编程 » C++, 代码片段
主要函数是timespec_get,可参考https://zh.cppreference.com/w/c/chrono/timespec_get
一个好用的 C++性能分析工具需满足几个条件:
C++内存检查和性能分析工具 valgrind里介绍了 valgrind 的安装,以及用于效率分析 profiler 工具。valgrind 最本来的功能是内存检查。这篇文章做简单的介绍。
编程 » C++, popen
popen函数可以获取比std::system函数更详细的程序输出。只是正常调用 popen 只能获取 stdout 的输出,而 stderr 的输出被忽略。
编程 » Linux, rsync
在同步一个超大文件时,发现 rsync 并没有按照预期的同步一个文件。而使用md5sum检验文件内容时,原始文件和目标文件的内容并不一样。
编程 » C++
有两种方法,一种在线程的调用函数内部设置,还有一种是在外部对指定线程变量做设置。
编程 » C++, folly
folly::fbstring是一个完全兼容std::string的类,可以做到无缝替换,而且性能更高。其代码参见https://github.com/facebook/folly/blob/master/folly/FBString.h
IT » gnu, Linux
简单列一些 Linux 自带的 GNU 命令的常用用法,可以当做 cheatsheet 使用。
编程 » C++, fmt
C++的fmt::format格式化库,由于效率高,功能强大,相关的 API 已经进入C++20,但其文档和 API 细节无法恭维。
今天刚看了《疯狂的外星人》。电影片头说原著是《乡村教师》。但整个电影,除了出现外星人之外,和《乡村教师》一点关系都没有。
【流浪地球】(《科幻世界》杂志 2000 年 7 月第 7 期)。作者:刘慈欣。