Linux free -m 详细说明

2023-11-05

 free 命令相对于top 提供了更简洁的查看系统内存使用情况:
$ free

                                      total            used         free      shared       buffers       cached
Mem:                        255268       238332     16936       0           85540       126384
-/+ buffers/cache:                        26408        228860
Swap:                        265000          0           265000
其中的相关说明:  
Mem:表示物理内存统计
-/+ buffers/cached:表示物理内存的缓存统计
Swap:表示硬盘上交换分区的使用情况(这里我们不去关心)
系统的总物理内存:255268Kb(256M),但系统当前真正可用的内存并不是第一行free 标记的 16936Kb,它仅代表未被分配的内存。
我们使用total1、used1、free1、used2、free2 等名称来代表上面统计数据的各值,1、2 分别代表第一行和第二行的数据。
total1:    表示物理内存总量。
used1:     表示总计分配给缓存(包含buffers 与cache )使用的数量,但其中可能部分缓存并未实际使用。
free1:     未被分配的内存。
shared1:   共享内存,一般系统不会用到,这里也不讨论。
buffers1: 系统分配但未被使用的buffers 数量。
cached1:   系统分配但未被使用的cache 数量。buffer 与cache 的区别见后面。
used2:     实际使用的buffers 与cache 总量,也是实际使用的内存总量。
free2:     未被使用的buffers 与cache 和未被分配的内存之和,这就是系统当前实际可用内存。
  可以整理出如下等式:
total1 = used1 + free1
total1 = used2 + free2
used1   = buffers1 + cached1 + used2
free2   = buffers1 + cached1 + free1
  buffer 与cache 的区别
A buffer is something that has yet to be "written" to disk.
A cache is something that has been "read" from the disk and stored for later use.
  更详细的解释参考:Difference Between Buffer and Cache
对于共享内存(Shared memory),主要用于在UNIX 环境下不同进程之间共享数据,是进程间通信的一种方法,一般的应用程序不会申请使用共享内存,笔者也没有去验证共享内存对上面等式的影响。如果你有兴趣, 请参考:What is Shared Memory?
  cache 和 buffer的区别:
Cache: 高速缓存,是位于CPU与主内存间的一种容量较小但速度很高的存储器。由于CPU的速度远高于主内存,CPU直接从内存中存取数据要等待一定时间周 期,Cache中保存着CPU刚用过或循环使用的一部分数据,当CPU再次使用该部分数据时可从Cache中直接调用,这样就减少了CPU的等待时间,提 高了系统的效率。Cache又分为一级Cache(L1 Cache)和二级Cache(L2 Cache),L1 Cache集成在CPU内部,L2 Cache早期一般是焊在主板上,现在也都集成在CPU内部,常见的容量有256KB或512KB L2 Cache。
Buffer:缓冲区,一个用于存储速度不同步的设备或优先级不同的设备之间传输数据的区域。通过缓冲区,可以使进程之间的相互等待变少,从而使从速度慢的设备读入数据时,速度快的设备的操作进程不发生间断。
  Free中的buffer和cache:(它们都是占用内存):
buffer: 作为buffer cache的内存,是设备的读写缓冲区
cache: 作为page cache的内存, 文件系统的cache
  如果 cache 的值很大,说明cache住的文件数很多。如果频繁访问到的文件都能被cache住,那么磁盘的读IO bi会非常小。
Buffer和Cache的区别
    缓存(cached)是把读取过的数据保存起来,重新读取时若命中(找到需要的数据)就不要去读硬盘了,若没有命中就读硬盘。其中的数据会根据读取频率进行组织,把最频繁读取的内容放在最容易找到的位置,把不再读的内容不断往后排,直至从中删除。
    缓冲(buffers)是根据磁盘的读写设计的,把分散的写操作集中进行,减少磁盘碎片和硬盘的反复寻道,从而提高系统性能。linux有一个守护进程定 期清空缓冲内容(即写如磁盘),也可以通过sync命令手动清空缓冲。举个例子吧:我这里有一个ext2的U盘,我往里面cp一个3M的MP3,但U盘的 灯没有跳动,过了一会儿(或者手动输入sync)U盘的灯就跳动起来了。卸载设备时会清空缓冲,所以有些时候卸载一个设备时要等上几秒钟。

修改/etc/sysctl.conf中的vm.swappiness右边的数字可以在下次开机时调节swap使用策略。该数字范围是0~100,数字越大越倾向于使用swap。默认为60,可以改一下试试。
两者都是RAM中的数据。简单来说,buffer是即将要被写入磁盘的,而cache是被从磁盘中读出来的。
buffer是由各种进程分配的,被用在如输入队列等方面,一个简单的例子如某个进程要求有多个字段读入,在所有字段被读入完整之前,进程把先前读入的字段放在buffer中保存。
cache经常被用在磁盘的I/O请求上,如果有多个进程都要访问某个文件,于是该文件便被做成cache以方便下次被访问,这样可提供系统性能。

Linux的内存管理,实际上跟windows的内存管理有很相像的地方,都是用虚拟内存这个的概念,说到这里不得不骂MS,为什么在很多时候还有很大的物理内存的时候,却还是用到了pagefile. 所以才经常要跟一帮人吵着说Pagefile的大小,以及如何分配这个问题,在Linux大家就不用再吵什么swap大小的问题,我个人认为,swap设个512M已经足够了,如果你问说512M的SWAP不够用怎么办?只能说大哥你还是加内存吧,要不就检查你的应用,是不是真的出现了memory leak.

在Linux下查看内存我们一般用command free
[root@nonamelinux ~]# free
                  total           used       free     shared    buffers     cached
Mem:    386024      377116     8908                 21280     155468
-/+ buffers/cache:     200368    185656
Swap:    393552            0          393552
下面是对这些数值的解释:
第二行(mem):
total:总计物理内存的大小。
used:已使用多大。
free:可用有多少。
Shared:多个进程共享的内存总额。
Buffers/cached:磁盘缓存的大小。
第三行(-/+ buffers/cached):
used:已使用多大。
free:可用有多少。
第四行就不多解释了。
区别:
第二行(mem)的used/free与第三行(-/+ buffers/cache) used/free的区别。
这两个的区别在于使用的角度来看,第一行是从OS的角度来看,因为对于OS,buffers/cached 都是属于被使用,所以他的可用内存是8908KB,已用内存是377116KB,其中包括,内核(OS)使用+Application(X,oracle,etc)使用的+buffers+cached.
第三行所指的是从应用程序角度来看,对于应用程序来说,buffers/cached 是等于可用的,因为buffer/cached是为了提高文件读取的性能,当应用程序需在用到内存的时候,buffer/cached会很快地被回收。
所以从应用程序的角度来说,可用内存=系统free( memory+buffers+cached.)
如上例:
185656=8908+21280+155468
接下来解释什么时候内存会被交换,以及按什么方交换。
当可用内存少于额定值的时候,就会开会进行交换.
如何看额定值(RHEL4.0):
#cat /proc/meminfo
交换将通过三个途径来减少系统中使用的物理页面的个数: 
1.减少缓冲与页面cache的大小,
2.将系统V类型的内存页面交换出去, 
3.换出或者丢弃页面。(Application 占用的内存页,也就是物理内存不足)。
事实上,少量地使用swap是不是影响到系统性能的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux free -m 详细说明 的相关文章

  • 通过特定分隔符删除字符串

    我的文件中有几列 其中第二列有 分隔符 我想删除第二列中的第一个 第三个和第四个字符串 并将第二个字符串留在该列中 但我有正常的分隔符空间 所以我不知道 input 22 16050075 A G 16050075 A G 22 16050
  • 从 csv 文件中删除特定列,保持输出上的相同结构[重复]

    这个问题在这里已经有答案了 我想删除第 3 列并在输出文件中保留相同的结构 输入文件 12 10 10 10 10 1 12 23 1 45 6 7 11 2 33 45 1 2 1 2 34 5 6 I tried awk F 3 fil
  • 如何在 shell 脚本中并行运行多个实例以提高时间效率[重复]

    这个问题在这里已经有答案了 我正在使用 shell 脚本 它读取 16000 行的输入文件 运行该脚本需要8个多小时 我需要减少它 所以我将其划分为 8 个实例并读取数据 其中我使用 for 循环迭代 8 个文件 并在其中使用 while
  • 域套接字“sendto”遇到“errno 111,连接被拒绝”

    我正在使用域套接字从另一个进程获取值 就像 A 从 B 获取值一样 它可以运行几个月 但最近 A 向 B 发送消息时偶尔会失败 出现 errno 111 连接被拒绝 我检查了B域套接字绑定文件 它是存在的 我也在另一台机器上做了一些测试 效
  • 加载数据infile,Windows和Linux的区别

    我有一个需要导入到 MySQL 表的文件 这是我的命令 LOAD DATA LOCAL INFILE C test csv INTO TABLE logs fields terminated by LINES terminated BY n
  • 如何使用GDB修改内存内容?

    我知道我们可以使用几个命令来访问和读取内存 例如 print p x 但是如何更改任何特定位置的内存内容 在 GDB 中调试时 最简单的是设置程序变量 参见GDB 分配 http sourceware org gdb current onl
  • Discord.net 无法在 Linux 上运行

    我正在尝试让在 Linux VPS 上运行的 Discord net 中编码的不和谐机器人 我通过单声道运行 但我不断收到此错误 Unhandled Exception System Exception Connection lost at
  • 如何在Linux内核源代码中打印IP地址或MAC地址

    我必须通过修改 Linux 内核源代码来稍微改变 TCP 拥塞控制算法 但为了检查结果是否正确 我需要记录 MAC 或 IP 地址信息 我使用 PRINTK 函数来打印内核消息 但我感觉很难打印出主机的MAC IP地址 printk pM
  • 如何释放字符指针数组?

    我使用此方法将列表中的值转换为数组 以便在 execvp 系统调用中使用 char list2argarray struct shellvalue values int count char array char malloc count
  • os.Mkdir 和 os.MkdirAll 权限

    我正在尝试在程序开始时创建一个日志文件 我需要检查是否 log如果不创建目录 则目录存在 然后继续创建日志文件 好吧 我尝试使用os Mkdir 也os MkdirAll 但无论我在第二个参数中输入什么值 我都会得到一个没有权限的锁定文件夹
  • 如何在apache 2.4.6上安装apxs模块

    我刚刚用过apt get update我的 apache 已更新为2 4 6 我想安装 apxs 来编译模块 但收到此错误 The following packages have unmet dependencies apache2 pre
  • Linux 可执行文件与 OS X“兼容”吗?

    如果您在基于 Linux 的平台上用 C 语言编译一个程序 然后将其移植以使用 MacOS 库 它会工作吗 来自编译器的核心机器代码在 Mac 和 Linux 上兼容吗 我问这个问题的原因是因为两者都是 基于 UNIX 的 所以我认为这是真
  • jpegtran 优化而不更改文件名

    我需要优化一些图像 但不更改它们的名称 jpegtran copy none optimize image jpg gt image jpg 但是 这似乎创建了 0 的文件大小 当我对不同的文件名执行此操作时 大小仍然完全相同 怎么样 jp
  • ubuntu:升级软件(cmake)-版本消歧(本地编译)[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我的机器上安装了 cmake 2 8 0 来自 ubuntu 软件包 二进制文件放置在 usr bin cmake 中 我需要将 cmake 版本至少
  • 将 jar 作为 Linux 服务运行 - init.d 脚本在启动应用程序时卡住

    我目前正在致力于在 Linux VM 上实现一个可运行的 jar 作为后台服务 我已经使用了找到的例子here https gist github com shirish4you 5089019作为工作的基础 并将 start 方法修改为
  • 在我的 index.php 中加载 CSS 和 JS 等资源时出现错误 403

    我使用的是 Linux Elementary OS 并在 opt 中安装了 lampp My CSS and JS won t load When I inspect my page through browser The console
  • jq中如何分组?

    这是 json 文档 name bucket1 clusterName cluster1 name bucket2 clusterName cluster1 name bucket3 clusterName cluster2 name bu
  • 查找哪些页面不再与写入时复制共享

    假设我在 Linux 中有一个进程 我从中fork 另一个相同的过程 后forking 因为原始进程将开始写入内存 Linux写时复制机制将为进程提供与分叉进程使用的不同的唯一物理内存页 在执行的某个时刻 我如何知道原始进程的哪些页面已被写
  • 我的线程图像生成应用程序如何将其数据传输到 GUI?

    Mandelbrot 生成器的缓慢多精度实现 线程化 使用 POSIX 线程 Gtk 图形用户界面 我有点失落了 这是我第一次尝试编写线程程序 我实际上并没有尝试转换它的单线程版本 只是尝试实现基本框架 到目前为止它是如何工作的简要描述 M
  • 如何通过ssh检查ubuntu服务器上是否存在php和apache

    如何通过ssh检查Ubuntu服务器上apache是 否安装了php和mysql 另外如果安装的话在哪个目录 如果安装了其他软件包 例如 lighttpd 那么它在哪里 确定程序是否已安装的另一种方法是使用which命令 它将显示您正在搜索

随机推荐

  • 复变函数与积分变换

    复变函数与积分变换 一 拉普拉斯变换 1 拉氏变换的性质 a 线性性质 b 相似性质 c 微分性质 例子 例子 拉式变换 象函数的微分性质 例子 例子 积分性质 象函数的积分性质 例子 例子 延迟性质 位移性质 拉氏变换的应用 一 拉普拉斯
  • keytool命令来生成证书缺少MD5

  • Stream篇(四)

    FileStream 如何去理解FileStream 通过前3章的学习相信大家对于Stream已经有一定的了解 但是又如何去理解FileStream呢 请看下图 我们磁盘的中任何文件都是通过2进制组成 最为直观的便是记事本了 当我们新建一个
  • SpringMVC使用Ajax请求返回中文乱码

    使用 ResponseBody标记返回参数 当类型为String时 返回的中文可能会出现乱码问题 而当返回值是Map
  • QTableWidget设置代理 添加QCombox

    一 实现功能 向QTableWidget上添加QCombox 显示效果 双击鼠标才显示Combox组件 如下图所示 未双击效果图 双击效果图 二 向第二列添加combox代码如下 ui tableWidget TestItems gt ve
  • MATLAB入门实战版

    写在前面 众所周知 MATLAB是理工科不可不知的利器 其功能之广 之强可谓万金油 其在科研 数模竞赛 课设等当中有着广泛的用途 甚至也有地方专门开了MATLAB的相关课程 学习MATLAB 对于非计算机专业的理工科选手而言还是很有用的 M
  • main函数,printf函数,和库函数

    main函数 printf函数和库函数 在C语言的入门学习中 细心的朋友们可以发现 一个C语言程序无论有多长 都有一个main函数 而在代码中想要输出结果 就需要用到printf函数 print函数其实就是一个库函数 而库函数有很多 接下来
  • 联想小新Air2020ill版换硬盘及安装Win11详细过程

    打开后盖 先拧下背后的7颗螺丝 红色的可以取下来 绿色的是固定在底板上的 拧松后不能取下来 紫色区域存在一个卡扣 在后文会提到 打开一个缝隙 b站官方拆机视频里的方法https www bilibili com video BV1L7411
  • BASE64转换为图片格式,并上传图片

    基本的把base64 转成图片 将BASE64转换为图片格式 代码 java public static final String JPG jpg public MessageBody
  • Python 爬虫详解

    一 爬虫概述 1 爬虫简介 要对数据进行处理和分析 首先就要拥有数据 在当今这个互联网时代 大量信息以网页作为载体 网页也就成了一个很重要的数据来源 但是 网页的数量非常之多 如果以人工的方式从网页上采集数据 工作量相当巨大 从本章开始就要
  • ElasticSearch IK 安装&使用

    中文分词器 在ES中支持中文分词器非常多 如 smartCN IK 等 推荐的就是 IK分词器 安装IK 开源分词器 Ik 的github GitHub medcl elasticsearch analysis ik The IK Anal
  • 对Python生成器的理解

    下午看了一点生成器的内容 这部分算是python的基础吧 所以我就不放在我的进阶系列了 正好吃饱饭没事做 就来写写我对生成器的一点浅薄理解吧 无聊的前言 一 为什么要有生成器 秉着先问为什么 再问怎么做的原则 我们来看看为什么python会
  • 坐标变换与基变换到底哪个左乘,哪个右乘??

    Version Date By Change Cost A 2020 3 18 AYZP First Version 三小时 前言 学习目的 1 坐标变换与基变换到底哪个左乘 哪个右乘 答案 根本就是由基和坐标的维数决定其到底左乘还是右乘
  • C语言练习题

    1 原码 反码 补码说法错误的是 作业内容 A 一个数的原码是这个数直接转换成二进制 B 反码是原码的二进制符号位不变 其他位按位取反 C 补码是反码的二进制加1 D 原码 反码 补码的最高位是0表示负数 最高位是1表示正数 解析为 ABC
  • JavaScript Date 对象

    解释 Date 对象用于处理日期与时间 语法 var d new Date var d new Date milliseconds var d new Date dateString var d new Date year month da
  • 异步线程池与定时任务线程池

    异步线程池与定时任务线程池 两个线程池都是一样的步骤 第一步是线程池配置 第二步写具体定时或异步任务 先看异步线程池 package com xnpool common async import org springframework be
  • C语言不用第三个变量实现两变量值互换

    大多数初学者都知道要实现两变量的值的调换 要用第三个变量来作为临时变量 有的教程拿酱油和醋互换瓶子作为例子 有的教程拿可乐和雪碧互换瓶子作为例子 不论怎么样都需要额外的第三个瓶子 今天介绍一种新的方法 可以不用第三个变量就实现两个数的互换
  • 如何搭建个人博客(详细图解)

    本文共计7000余字 总框架 一目标 搭建个人博客 二各种搭建途径 途径1 略 途径2 2 1利用emlog 宝塔面板 服务器建立网站 123 112233 我的 https justgogoal com 2020 07 09 22 39
  • hook介绍

    一 hook 钩子 按照生命周期和功能进行封装 优势 逻辑简化 而 钩子 的意思 就是在事件传送到终点前截获并监控事件的传输 像个钩子钩上事件一样 并且能够在钩上事件时 处理一些自己特定的事件 1 要启用Hooks 所有React软件包都必
  • Linux free -m 详细说明

    free 命令相对于top 提供了更简洁的查看系统内存使用情况 free total used free shared buffers cached Mem 255268 238332 16936 0 85540 126384 buffer