深入理解 Linux 内存管理:free 命令详解
在 Linux 系统中,内存是关键的资源之一,管理和监控内存的使用情况对系统的稳定性和性能至关重要。free 命令是 Linux 中用于查看内存使用情况的重要工具,它可以让我们快速了解系统中物理内存和交换分区(Swap)的使用状态。
本文介绍 free 命令的输出、各个字段的含义和内存的使用率计算等。帮助更好地理解和管理 Linux 系统中的内存资源。
1. `free` 命令的基本用法
运行 free 命令,系统会输出当前内存的使用情况。常用的 free 命令选项包括:
free:显示内存和交换分区的使用情况。free -h:以人类可读的格式显示(自动选择合适的单位,如 GB、MB)。free -m:以 MB 为单位显示内存使用情况。free -g:以 GB 为单位显示内存使用情况。
运行 free -h 命令后,得到如下输出:
free -htotal used free shared buff/cache available
Mem: 31G 9.0G 12G 326M 9.8G 21G
Swap: 7.9G 3.9G 4.0G
2. `free` 命令输出字段详解
free 命令的输出通常分为两部分:物理内存(Mem) 和 交换分区(Swap)。它们各自包含几个关键字段,帮助我们了解系统内存的使用情况。
2.1. 物理内存(Mem)
- total:物理内存总量。
该值表示系统中所有的物理内存(RAM)的总大小。在上例中,系统有 31GB 的物理内存。 - used:已使用的物理内存。
该值表示目前被操作系统和应用程序使用的内存,包括程序本身占用的内存以及用于缓存和缓冲的数据。上例中,已使用内存为 9.0GB。 - free:空闲的物理内存。
这是当前没有被使用的物理内存。在上例中,空闲内存为 12GB。 - shared:共享内存。
该字段表示用于进程间共享内存的部分,通常是tmpfs或类似机制分配的内存。在上例中,共享内存为 326MB。 - buff/cache:缓冲和缓存占用的内存。
Linux 系统会尽量利用空闲内存来缓存文件系统中的数据,以加速文件读取。这部分内存可以在需要时快速释放给应用程序使用。上例中,缓存和缓冲占用了 9.8GB。 - available:可用的内存。
该值表示系统中实际可供新进程使用的内存,包括free内存和可以随时回收的buff/cache内存。上例中,可用内存为 21GB。这个字段比free更能准确反映系统的内存可用性。
2.2. 交换分区(Swap)
交换分区是当物理内存不足时,Linux 将部分内存页交换到硬盘上的区域。交换分区虽然能够帮助系统在内存不足时继续运行,但访问速度远不如物理内存快,频繁使用交换分区可能会影响系统性能。
- total:交换分区总量。
表示系统中的交换分区大小。在上例中,系统有 7.9GB 的交换分区。 - used:已使用的交换分区。
显示当前被使用的交换分区大小。在上例中,3.9GB 的交换分区已经被使用。 - free:空闲的交换分区。
显示剩余可用的交换分区大小。在上例中,4.0GB 的交换分区仍然可用。
3. 如何正确计算内存使用率?
在 Linux 中,内存的使用率并不是简单地用 used / total 来计算。因为 Linux 会尽可能利用空闲内存用于缓存和缓冲,这部分内存虽然被标记为“已使用”,但在需要时可以快速释放。因此,计算内存使用率时,应该排除缓存和缓冲区的内存。
3.1. 不考虑缓存和缓冲的内存使用率
最简单的内存使用率计算方式是直接使用 `used` 字段:内存使用率 = (used / total) * 100
根据上面的数据:
内存使用率 = (9.0G / 31G) * 100 ≈ 29.03%
这种方式虽然简单,但不够准确,它将缓存和缓冲的内存也算作已使用内存,可能会高估实际的内存使用情况。
3.2. 考虑缓存和缓冲的内存使用率(更准确)
为了更准确地反映系统的内存使用情况应排除掉 buff/cache 部分的内存。改进后的计算公式为:
内存使用率 = ((total - free - buff/cache) / total) * 100
根据上面的数据:
内存使用率 = ((31G - 12G - 9.8G) / 31G) * 100= (9.2G / 31G) * 100 ≈ 29.68%
这种计算方式排除了缓存和缓冲区的内存,更能反映系统的实际内存使用情况。
3.3. 使用 `available` 字段
直接使用 available 字段也可以帮助我们快速判断系统的内存可用性。available 包含了当前空闲内存和可以快速回收的缓存内存,因此它比 free 字段更准确。
4. 交换分区的作用与使用
交换分区(Swap)是物理内存的延伸,当 RAM 不足时,系统会将部分不常用的内存页写入交换分区。虽然交换分区可以缓解内存不足的情况,但由于磁盘的速度远低于物理内存,频繁使用交换分区可能会导致系统变慢。
因此,当发现系统频繁使用交换分区时,可能需要考虑增加物理内存,或者优化内存密集型的应用程序。
如何查看 Swap 使用情况:
free -htotal used free shared buff/cache available
Mem: 31G 9.0G 12G 326M 9.8G 21G
Swap: 7.9G 3.9G 4.0G
系统有 7.9GB 的交换分区,其中 3.9GB 已经被使用,剩下 4.0GB 可用。
5. `free` 命令的其他选项详解及组合使用
除了 free 命令的基本用法外,它还提供了多个选项用于不同的场景。可以通过不同的参数组合来获取更精确的内存信息。以下是 free 的一些常用选项及其组合使用方法:
5.1. 常用选项
-b:以字节(bytes)为单位显示内存信息。-k:以千字节(kilobytes)为单位显示内存信息。这是默认单位。-m:以兆字节(megabytes)为单位显示内存信息。-g:以千兆字节(gigabytes)为单位显示内存信息。-h:以人类可读(human-readable)格式显示内存信息,自动选择合适的单位(B、KB、MB、GB)。-t:显示内存和交换分区的 总计 信息。
使用 -t 选项时,free 会额外添加一行 Total,显示物理内存和交换分区的总和。
free -h -t
输出结果:
total used free shared buff/cache available
Mem: 31G 9.0G 12G 326M 9.9G 21G
Swap: 7.9G 3.9G 4.0G
Total: 39G 12G 16G
-s [秒数]:每隔指定的时间间隔(以秒为单位)重复显示内存信息,对于持续监控内存使用情况特别有用。
例:每隔 2 秒打印一次内存使用情况:
free -s 2
输出结果:
total used free shared buff/cache available
Mem: 31G 9.0G 12G 326M 9.9G 21G
Swap: 7.9G 3.9G 4.0Gtotal used free shared buff/cache available
Mem: 31G 9.0G 12G 326M 9.9G 21G
Swap: 7.9G 3.9G 4.0G
……
-c [次数]:与-s选项一起使用,用于指定重复显示的次数。
例:每隔 2 秒显示一次内存使用情况,总共显示 5 次:
free -h -s 2 -c 5
-w:显示内存的额外列, 现代系统的默认输出已经相对完整,-w选项的作用不明显, 默认输出已经是宽模式。-l: 显示低端和高端内存的详细统计信息。在 32 位系统上,它能提供有用的信息,但在 64 位系统上,它的作用可能不大,输出的低端和高端内存数值可能相同。
6.交换分区(Swap)的清除与影响
6.1. 交换分区可以清除吗?
交换分区(Swap)可以手动清除(即关闭交换分区)。在某些情况下,想要释放硬盘空间或调整系统性能时,可能需要临时关闭交换分区。
在 Linux 中,交换分区可以通过以下命令来清除(关闭):
sudo swapoff -a
swapoff -a:这个命令会关闭系统中所有的交换分区和交换文件。所有在交换分区中的数据会被迁移回物理内存。如果物理内存不足,可能会导致系统性能下降,甚至进程崩溃。
6.2. 清除交换分区的影响
交换分区是物理内存的延伸,当内存不足时,系统会将一些不常用的内存页写入交换分区。如果清除(关闭)交换分区,系统会尝试将这些内容重新加载回物理内存。如果物理内存足够多,通常不会有太大问题,但如果内存不足,可能会导致以下影响:
- 内存不足:如果物理内存不足,关闭交换分区后可能会导致系统内存用光,进而引发 OOM(Out of Memory,内存溢出) 事件。Linux 内核中的 OOM 杀手(OOM Killer)会强制终止一些进程,从而释放内存空间。可能导致某些重要的应用程序被意外终止。
- 系统变慢或无响应:在内存不足时,交换分区可以缓解内存压力。如果没有交换分区,当物理内存用尽时,系统可能会变得非常缓慢,甚至无响应。
- 性能提升或下降:在某些情况下,关闭交换分区可以提升性能,当系统依赖交换分区时,因为硬盘(或 SSD)的速度远低于物理内存。如果系统频繁使用交换分区,性能会显著下降,因此关闭交换分区可以强制系统使用更快的物理内存。但只能在物理内存充足的情况下才有效。
6.3. 重启后交换分区会自动清除吗?
在大多数 Linux 系统中,交换分区在重启后不会被自动清除,而是会自动重新启用。这是因为在系统启动时,/etc/fstab 文件中定义了需要挂载的交换分区或交换文件。系统启动时会根据这个文件自动启用交换分区。
可以通过以下命令查看系统中当前启用的交换分区:
sudo swapon --show
输出结果:
NAME TYPE SIZE USED PRIO
/dev/dm-1 partition 7.9G 3.9G -1
/dev/dm-1是一个逻辑卷管理器(LVM)设备,作为交换分区使用。partition表示该交换空间位于磁盘上的一个分区,而非文件。7.9G是该交换分区的总大小。3.9G是当前已使用的交换空间,表明系统内存压力较大,部分数据被写入了交换分区。-1是交换分区的优先级,表示它的默认优先级较低(可以调整)。
6.4. 如何永久禁用交换分区?
如果想让系统在重启后不再启用交换分区,可以编辑 /etc/fstab 文件并注释掉(或删除)与交换分区相关的行。
- 打开
/etc/fstab文件:
sudo vim /etc/fstab
- 找到类似于以下内容的行(具体的设备名称可能不同):
/dev/sda2 swap swap defaults 0 0
- 注释掉这一行(在行前加上
#):
# /dev/sda2 swap swap defaults 0 0
- 保存并退出文件。
- 重启系统后,交换分区将不会再自动启用。如果希望再次启用交换分区,可以取消该行的注释,或者手动运行以下命令启用:
sudo swapon -a
6.5. 如何手动清除交换分区?
如果希望在系统运行的过程中手动清除交换分区,可以通过以下步骤实现:
- 关闭交换分区:
sudo swapoff -a
清除所有交换分区中的数据,并将其数据移回物理内存。
- 如果想要释放交换分区的空间(如删除交换文件),可以在关闭交换后删除对应的交换分区或交换文件。
- 若使用交换分区,可以通过
fdisk或gparted删除交换分区。 - 若使用交换文件,可以删除该文件:
- 若使用交换分区,可以通过
- 如果不想永久禁用交换分区,只是临时清除,可以在需要时重新启用:
sudo swapon -a
6.6. 总结
- 清除交换分区(swapoff) 是可以的,如果物理内存不足,关闭交换分区可能导致系统性能下降或进程终止。
- 重启后交换分区不会自动清除,它会根据
/etc/fstab文件中的配置重新启用。 - 永久禁用交换分区,可以编辑
/etc/fstab文件并注释掉与交换分区相关的行。 - 手动关闭交换分区后,系统会将交换分区中的数据移回物理内存。如果物理内存不够,可能会引发 OOM 事件,导致进程被强制终止。
- 物理内存充足的情况下,禁用交换分区可能会提高系统性能,因为这减少了使用较慢的磁盘 I/O。交换分区提供了额外的缓冲,防止内存耗尽,因此禁用它需要根据具体情况决定。
7. 小结
free 命令是 Linux 系统中监控内存使用情况的常用工具。理解 free 命令输出中的各个字段,尤其是 used、buff/cache 和 available,对于正确评估系统内存状况至关重要。
核心要点:
- 物理内存:包括总内存、已使用内存、空闲内存、共享内存、缓存/缓冲内存,以及可用内存。
- 交换分区:当物理内存不足时,系统会将部分数据交换到硬盘上的交换分区。过度使用交换分区会影响系统性能。
- 内存使用率计算:排除缓存和缓冲的内存后,内存使用率会更准确地反映系统的实际压力。
free的其他命令选项:free提供了多种选项来满足不同的内存监控需求,组合使用这些选项可以帮助我们更加灵活和全面地监控系统内存。
希望这篇文章能帮助到你,如果有其他问题或建议,欢迎留言讨论!
相关文章:
深入理解 Linux 内存管理:free 命令详解
在 Linux 系统中,内存是关键的资源之一,管理和监控内存的使用情况对系统的稳定性和性能至关重要。free 命令是 Linux 中用于查看内存使用情况的重要工具,它可以让我们快速了解系统中物理内存和交换分区(Swap)的使用状态…...
指针万字超级最强i解析与总结!!!!!
文章目录 1.内存和地址1.1内存1.2究竟该如何理解编址 2.指针变量和地址2.1 取地址操作符(&)2.2指针变量和解引用操作符(*)2.2.1指针变量2.2.2如何拆解指针类型2.2.3解引用操作符 2.3 指针变量的大小 3.指针变量类型的意义3.1指…...
告别生硬电子音,这款TTS软件让语音转换更自然动听
Balabolka是一款革新性的文本语音转换工具,为用户提供了极其灵活和个性化的阅读体验。这款软件不仅仅是简单的文字朗读器,更是一个智能的语音助手,能够将各类文本瞬间转化为生动自然的语音输出。 软件的核心优势在于其卓越的文件兼容性和多样…...
CORS(跨域资源共享)和SOP(同源策略)
CORS(跨域资源共享)和SOP(同源策略)不是同一个东西,但它们紧密相关,并且常常一起讨论,因为 CORS 是为了解决同源策略带来的跨域问题而引入的。 同源策略(Same-Origin Policy&#x…...
【系统设计】数据库压缩技术详解:从基础到实践(附Redis内存优化实战案例)
概述 在现代数据库系统中,压缩技术对于提高存储效率和加速查询性能至关重要。特别是在处理大规模数据时,压缩能够极大地减少存储空间,并优化查询性能。本文将总结几种常见的压缩方式,并通过详细的解释和示例清晰地展示每种压缩方…...
基于SpringBoot的“乐校园二手书交易管理系统”的设计与实现(源码+数据库+文档+PPT)
基于SpringBoot的“乐校园二手书交易管理系统”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 系统首页界面图 用户注册界面图 二手…...
debian11安装最新rabbitmq
1、使用官网提供系统对应的安装脚本 安装 版本说明: Debian Buster代表Debian 10 Debian Bullseye代表Debian 11 Debian Bookworm代表Debian 12 Debian Trixie代表Debian 13 Debian Sid代表Debian unstable版本 2、新建脚本文件 vim rabbitMq.sh将脚本内容复制到…...
三十三、Python基础语法(面向对象其他语法-下)
一、属性划分 1.类属性 类属性:类属性就是类对象具有的属性,一般写法在类内部、方法的外部定义的变量,就是类属性,类属性在内存中只有一份。可以通过类名直接访问,也可通过实例访问。 class Circle:# 类属性,定义圆…...
简单又便宜的实现电脑远程开机唤醒方法
现有的远程开机方案 1)使用向日葵开机棒 缺点是比较贵一点,开机棒要一百多,而且查了评论发现挺多差评说不稳定,会有断联和无法唤醒的情况,而且设置也麻烦,还需要网卡支持WOL 2)使用远程开机卡 …...
Flutter鸿蒙next 状态管理框架对比分析
在 Flutter 开发中,状态管理是一个非常重要且关键的主题。Flutter 中的应用状态管理直接影响着应用的性能、可维护性和开发效率。随着 Flutter 生态的成熟,已经出现了许多不同的状态管理方案,各具特色,适用于不同的开发场景。本文…...
Vue Router进阶详解
导航守卫 若依框架登录鉴权详解(动态路由)_若依鉴权-CSDN博客 完整的导航解析流程 导航被触发: 当用户点击页面中的链接、使用编程式导航(如router.push或router.replace)或手动输入URL时,导航流程被触发。…...
进程的控制
进程 task_struct mm_struct(虚拟地址空间) 页表 代码和数据 。 新建进程先有管理系统,然后才有代码和数据。 fork()函数:子进程返回0,父进程返回的是子进程的pid - - - 方便父进程对子进程标识。 进程终止:释放代码和数据占…...
基于C语言实现的图书管理系统
使用Visual Studio 2022编译工具进行编写代码的。 项目源码直接奉上: book1.h头文件: #ifndef __BOOK1_H //预处理用于条件编译 避免头文件反复包含 #define __BOOK1_H#include<stdio.h> #include <string.h> #include<stdlib.h> #include<stdbool.h&g…...
删除 需要来自XXXX的权限才能对此文件夹进行更改 文件的解决办法
如果你也是: 如果你也有类似上面的问题,这篇文章算是你看对了,哦哟! 我的牙齿现在是怨灵的牙齿,可以啃下一头牛。 翻遍千山万水,咱们也是终于取到真经了家人们。 首先下一个everything好吗 甩一个官网链…...
ARM base instruction -- ccmp (immediate)
Conditional Compare (immediate) sets the value of the condition flags to the result of the comparison of a register value and an immediate value if the condition is TRUE, and an immediate value otherwise. 此指令一般出现在 cmp 指令之后,表示双重比…...
高德 阿里231滑块 分析
声明: 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 有相关问题请第一时间头像私信联系我删…...
Unity 的 WebGL 构建中资源图片访问方式
在 Unity 的 WebGL 构建中,资源图片是可以打包在 工程内部 使用的,前提是这些资源被正确地包含在构建中,并且能够通过合适的方式加载和访问。不同于传统的本地文件访问,WebGL 需要通过 Asset Bundles、Addressables 或 Resources …...
WinForms 中使用 MVVM 模式构建应用:实现登录页面、页面导航及 SQLite 数据库连接完整框架搭建过程
前言 在传统的 WinForms 应用程序开发中,很多开发者使用事件驱动的设计模式,直接将业务逻辑编写在界面代码中。然而,随着应用程序的复杂性增加,单一的界面文件变得臃肿,难以测试和维护。借鉴 WPF 中 MVVM(…...
Chrome调试工具(查看CSS属性)
来说说这个Chrome调试工具吧,梦回gdb,但是它没有gdb难 打开浏览器 有两种方式可以直接打开Chrome调试工具 直接按F12 鼠标右键页面 --- 检查元素 什么mc玩家是鸣潮 标签页含义 🤒 elements查看标签结构(展示html文件&#…...
MQTT从入门到精通之MQTT入门
MQTT入门 1 MQTT概述 1.1 MQTT简介 MQTT(Message Queuing Telemetry Transport)由IBM于1999年开发的一种基于**"发布订阅模式"的轻量级的消息传输协议**! 发布订阅模式是一种传统的客户端-服务器架构的替代方案,因为…...
简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...
相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...
深入理解Optional:处理空指针异常
1. 使用Optional处理可能为空的集合 在Java开发中,集合判空是一个常见但容易出错的场景。传统方式虽然可行,但存在一些潜在问题: // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...
ubuntu22.04 安装docker 和docker-compose
首先你要确保没有docker环境或者使用命令删掉docker sudo apt-get remove docker docker-engine docker.io containerd runc安装docker 更新软件环境 sudo apt update sudo apt upgrade下载docker依赖和GPG 密钥 # 依赖 apt-get install ca-certificates curl gnupg lsb-rel…...
书籍“之“字形打印矩阵(8)0609
题目 给定一个矩阵matrix,按照"之"字形的方式打印这个矩阵,例如: 1 2 3 4 5 6 7 8 9 10 11 12 ”之“字形打印的结果为:1,…...
负载均衡器》》LVS、Nginx、HAproxy 区别
虚拟主机 先4,后7...
DeepSeek越强,Kimi越慌?
被DeepSeek吊打的Kimi,还有多少人在用? 去年,月之暗面创始人杨植麟别提有多风光了。90后清华学霸,国产大模型六小虎之一,手握十几亿美金的融资。旗下的AI助手Kimi烧钱如流水,单月光是投流就花费2个亿。 疯…...
