上一篇文章介绍了linux下的sigar 库,并使用sigar 库来获取cpu 使用率,本文在这里介绍一下如何使用sigar 库获取内存信息.

和cpu 一样,sigar中有和内存相关的结构体sigar_mem_t,我们来看一下结构体原型:

typedef struct {

sigar_uint64_t

ram,

total,

used,

free,

actual_used,

actual_free;

double used_percent;

double free_percent;

} sigar_mem_t;

从中可以看到和结构体相关的信息还是比较全面的,包括内存总量(total),实际内存使用量(actual_used),实际内存剩余量(actual_free),并且还包括内存使用率(used_percent),和内存空闲率(free_percent).

好了,接下来我们看看怎样获得这些数据.

对于内存信息的获取,我们要用到sigar_mem_get 函数,函数原型如下:

SIGAR_DECLARE(int) sigar_mem_get(sigar_t *sigar, sigar_mem_t *mem);

很简单,传递一个sigar_t 类型和sigar_mem_t 类型的指针就可以了.其中这个sigar_t 上一篇文章中我们介绍过,程序的初始化都要用到这个sigar_t.

另外,sigar中对于虚拟内存(swap 分区)信息的获取也有特定的结构体sigar_swap_t,感兴趣的同学可以参照获取内存信息的方式来获取一下虚拟内存的信息.

好了,下面是程序的源码,因代码较少,就不逐一分析了,相信你一看就明白了.

#include

#include

#include

using namespace std;

int main(int argc,char **argv)

{

sigar_t *sigar_mem;

sigar_mem_t mem;

sigar_open(&sigar_mem);

sigar_mem_get(sigar_mem,&mem);

uint64_t total = mem.total/1024;

uint64_t used = mem.actual_used/1024;

uint64_t free = mem.actual_free/1024;

double used_percent = mem.used_percent;

double free_percent = mem.free_percent;

cout<

cout<

cout<

cout<

cout<

sigar_close(sigar_mem);

return 0;

}

我们打印一下输出结果:

细心的同学可能会用free 命令的结果做一下比较:

结果发现free 的值和程序中获取的不一样,这是怎么回事?

其实,这里涉及到linux 内存管理机制的东西,linux 内核会把剩余的内存申请为cached,而cached不属于free范畴。

直观的看free命令的free值很小,但并不代表可用的内存小,当一个程序需要申请较大的内存时,如果free的内存不够,内核会把部分cached的内存回收,回收的内存再分配给应用程序。

所以对于linux系统,可用于分配的内存不只是free的内存,还包括cached 的内存 和buffers 的内存.

这就是为什么我们程序中计算可用内存的时候用mem.actual_free 而不是 mem.free 了,这么一说相信聪明的你肯定明白了.

sigar如何获取linux的buffer内存,Linux 下使用Sigar 获取内存信息相关推荐

  1. linux java读取文件夹下文件名,Java获取Linux上指定文件夹下所有第一级子文件夹...

    说明:需要只获得第一级文件夹目录 package com.sunsheen.jfids.studio.monitor.utils; import java.io.BufferedReader; imp ...

  2. linux缓存buffer,【Linux】清理缓存buffer/cache

    运行sync将dirty的内容写回硬盘 sync 通过修改proc系统的drop_caches清理free的cache echo 3 > /proc/sys/vm/drop_caches ech ...

  3. linux sleeping进程多_Linux下找出吃内存的方法总结

    linux下查询进程占用的内存方法总结,假设现在有一个「php-cgi」的进程 ,进程id为「25282」.现在想要查询该进程占用的内存大小.linux命令行下有很多的工具进行查看,现总结常见的几种方 ...

  4. linux cache buffer区别,Linux buffer/cache异同

    buffers与cached 1).异同点 在Linux 操作系统中,当应用程序需要读取文件中的数据时,操作系统先分配一些内存,将数据从磁盘读入到这些内存中,然后再将数据分发给应用程序:当需要往文件中 ...

  5. linux 监控java内存_Linux下实用的JAVA内存泄露监控命令及工具

    一.Linux 命令 1.jstack (linux下特有) 可以观察到jvm中当前所有线程的运行情况和线程当前状态 jstack 2083 输出内容如下: 2.jmap (linux下特有,也是很常 ...

  6. linux 查看显卡信号_Linux下如何查看NVIDIA显卡信息

    匿名用户 1级 2015-07-28 回答 lspci  | grep -i vga 这样就可以显示机器上的显卡信息,比如 [root@localhost conf]# lspci | grep -i ...

  7. linux清除内存buffer,Linux清理Buffer/Cache内存空间让系统变流畅

    Linux 中 Buffer/Cache内存占用过高解决方法 在Linux系统中,我们经常用free命令来查看系统内存的使用状态.在一个RHEL6的系统上,free命令的显示内容大概是这样一个状态: ...

  8. Linux环境进程间通信系列(五):共享内存

    共享内存(上) 共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式.两个不同进程A.B共享内存的意思是,同一块物理内存被映射到进程A.B各自的进程地址空间.进程A可以即时看到进程B对共享内存 ...

  9. vc++6.0获取磁盘基本信息_分享一个实用脚本--一键获取linux内存、cpu、磁盘IO等信息...

    概述 今天主要分享一个shell脚本,用来获取linux系统CPU.内存.磁盘IO等信息. 脚本 #!/bin/bash # 获取要监控的本地服务器IP地址 IP=`ifconfig | grep i ...

最新文章

  1. [转]JavaScript代码收集
  2. python安装numpy-python安装numpy和pandas的方法步骤
  3. Mylyn 2.0,第 2 部分: 自动上下文管理
  4. mysql like 中文版_MySQL使用like查询中文不准确的解决方法
  5. Java的编年史和低延迟
  6. 架构设计 | 缓存管理模式,监控和内存回收策略
  7. 网站登陆页面设计灵感,UI设计得有这个范儿
  8. c#查看远程文件是否存在
  9. 用Blink打造你的技术朋友圈
  10. 最新 Bitnami redmine安装与配置
  11. Centos7 Kubernetes(k8s) 开发服务器(单服务器)部署 redis 缓存
  12. html中id和name的异同
  13. 元宇宙趋势下的前端现状
  14. Spring AOP tx:advice
  15. 建站的原型图是什么意思?
  16. python生成条形码(不限制长度)
  17. SOA、RMI、RPC、Rest、RestFul、Soap、WebService 详解
  18. 使用Quasar进行木马植入
  19. stm32【RGB_LED_WS2812灯珠】
  20. 谷歌刚刚发布了2500万个免费数据集,快来了解一下

热门文章

  1. [Abp vNext 源码分析] - 3. 依赖注入与拦截器
  2. ASP.NET Core Web API下事件驱动型架构的实现(二):事件处理器中对象生命周期的管理
  3. 初探SQL Server 2017 on Docker@macOS
  4. .net core 2.0学习笔记(一):开发运行环境搭建
  5. 微软推出《我的世界》“编程一小时”免费教程,携手Code.org普及计算机科学教育
  6. F#年度调查结果概述
  7. 微软准备开源PowerShell
  8. mysql qps如何查看_mysql状态查看 QPS/TPS/缓存命中率查看
  9. 【BIM入门实战】Revit入门基础知识选择题带答案解析(116题)
  10. Android之Unexpected error while executing: am start -n “***.Activity“-a android.intent.action.MAIN