来源:chatGPT
通过读取文件 /proc/self/statm
来获取内存使用情况。
#include <iostream>
#include <fstream>
#include <string>
void getMemoryUsage() {
std::ifstream statm("/proc/self/statm");
if (!statm.is_open()) {
std::cerr << "Could not open /proc/self/statm" << std::endl;
return;
}
long size, resident, shared, text, lib, data, dt;
statm >> size >> resident >> shared >> text >> lib >> data >> dt;
statm.close();
std::cout << "Total size: " << size << " pages" << std::endl;
std::cout << "Resident size: " << resident << " pages" << std::endl;
}
int main() {
getMemoryUsage();
return 0;
}
参数的含义
-
在
/proc/self/statm
中,获取到的每一项信息对应的含义如下: -
size
: 进程所占用的总虚拟内存的大小(以页面
为单位),包括代码段、数据段、共享库等。 -
resident
: 进程当前占用的物理内存的大小(以页面为单位)。这表示实际在 RAM 中的内存,不包括交换空间。 -
shared
: 进程与其他进程共享的内存页面的数量(以页面为单位)。这包括共享库和其他共享资源的内存。 -
text
: 进程的代码段所占用的内存页面数量(以页面为单位)。这部分是实际执行的程序代码。 -
lib
: 进程加载的共享库的大小(以页面为单位)。在现代系统中,这项通常为 0,因为共享库的大小通常被包含在 shared 项中。 -
data
: 进程的数据段和堆的大小(以页面为单位)。这部分包括静态变量和动态分配的内存。 -
dt
: 进程的交换空间中使用的内存页面数量(以页面为单位),通常很少使用。
注意事项
- 每个页面的大小通常为
4 KB
,但可以根据系统配置有所不同。所以需要将读取的结果乘以4K
,才是内存使用量。 - 这些信息有助于分析进程的内存使用情况,了解它是如何占用系统资源的。
改进版
#include <unistd.h>
class Utils {
public:
struct memuse {
bool success;
long size, resident, shared, text, lib, data, dt;
};
static struct memuse get_memory_usage() {
struct memuse use;
std::ifstream statm("/proc/self/statm");
if (!statm.is_open()) {
use.success = false;
return use;
}
statm >> use.size >> use.resident >> use.shared >> use.text >> use.lib >> use.data >> use.dt;
statm.close();
use.success = true;
return use;
}
};
int main() {
auto use = Utils::get_memory_usage();
}