Linux 下 C++获得内存使用量

Linux 下 C++获得内存使用量

Linux下获取内存使用量

在 Linux 中,可用内存(Available)的计算方式并不是空闲内存(Free)加上缓冲/缓存(Buffers/Cached)的总和。这是一个常见的误解。实际上,"可用"内存是指可以不需要更多的IO即可立即使用的内存量。

这是因为,当需要更多内存时,Linux会尝试释放缓存,但缓冲区的内存不一定都能被释放。因此,"可用"内存的计算考虑了这个因素。

在内核3.14以后,包括Ubuntu 16.04及其后续版本的Linux系统中,"free"命令的输出中新增了一个"available"的列。这个列的值是内核估算的可用于启动新应用程序的内存量,而不必交换(swap)。

具体计算公式如下:

MemAvailable = MemFree + Buffers + Cached - (Shmem + Kernel_stack + PageTables + Slab)

这个公式中的每项都可以在"/proc/meminfo"中找到。其中,

MemFree:未使用的内存
Buffers:用于块设备的缓冲区
Cached:被各种驱动程序用来映射设备内存和其他各种目的的内存
Shmem:共享内存
Kernel_stack:内核栈的大小
PageTables:管理虚拟内存到物理内存的映射的页面表的大小
Slab:内核数据结构缓存

这个公式的具体含义是:系统实际可用的内存,等于空闲的内存,加上用于各种缓存的内存,减去用于共享内存、内核栈、页面表和Slab的内存。

代码实现

#include <sys/sysinfo.h>
#include <fstream>

struct sysinfo memInfo;
ret_monitorSystem_ = sysinfo (&memInfo);
if (ret_monitorSystem_ == -1)
{
    ROS_ERROR("cann't get system info!");
    return;
}

    // 获取内存使用率
    double MemTotal = memInfo.totalram / 1024;
    double MemFree = memInfo.freeram / 1024;

// 读取 /proc/meminfo 文件获取其他内存信息
std::ifstream meminfo_file("/proc/meminfo");

unsigned long long Buffers, Cached, Shmem, KernelStack, PageTables, Slab;
std::string dummy;

if(meminfo_file.is_open())
{
    while(meminfo_file >> dummy)
    {
        if(dummy == "Buffers:")
            meminfo_file >> Buffers;
        else if(dummy == "Cached:")// 获取内存使用率
double MemTotal = memInfo.totalram;
double MemFree = memInfo.freeram;

            meminfo_file >> Cached;
        else if(dummy == "Shmem:")
            meminfo_file >> Shmem;
        else if(dummy == "KernelStack:")
            meminfo_file >> KernelStack;
        else if(dummy == "PageTables:")
            meminfo_file >> PageTables;
        else if(dummy == "Slab:")
            meminfo_file >> Slab;
    }
    meminfo_file.close();
}
else
{
    ROS_ERROR("Cannot open /proc/meminfo");
    return;
}

double MemAvailable = MemFree + Buffers + Cached - Shmem - KernelStack - PageTables - Slab;

double MemUsed = MemTotal - MemAvailable;
MemUsageRate_ = MemUsed / MemTotal;

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值