文章目录
内存介绍
当使用 free 命令:查看内存使用时,会出现:
参数 | 含义 |
---|---|
total | 内存总数 |
used | 已用内存 |
free | 空闲内存 |
shared | 共享内存 |
buff/cache | 缓存(buffer+cache) |
available | 可用内存 |
buff/cache 与匿名页
Linux 内存页分为两类:
类型 | 体现位置 | 来源 | 回收方式 |
---|---|---|---|
文件页 | buff/cache | 文件内容/元数据 | 丢弃/写回文件,不进Swap |
匿名页 | used-buff/cache | 程序堆/栈 | 写入Swap |
- buff/cache:即文件页(Page Cache + Buffer Cache)总和,用于加速文件和块设备访问。
- 匿名页:程序运行时动态分配的内存(如堆、栈),不包含在buff/cache中,是Swap的主要来源。
自 Linux 2.4 起,Page Cache 和 Buffer Cache 已合并为统一的文件缓存系统。[
Swap(交换空间):内存的临时仓库
- 本质:一块特殊的磁盘空间(分区或文件),作为物理内存耗尽时的紧急备用。
- 作用:当物理内存不足时,内核会把内存中不活跃的"匿名页"(见下文)暂时写入 Swap,从而释放物理内存给更需要的进程。
- 代价:硬盘读写速度远慢于内存。频繁使用 Swap 会导致系统性能急剧下降(卡顿),这个现象称为"颠簸"(Thrashing)。
内存回收与Swap机制
内存页的两种类型
程序占用的内存可分为两类,内核对它们有不同的回收策略:
文件页 (File-backed Pages)
- 内容:程序代码、读取的文件等,即 Page Cache 的主要组成部分。
- 特点:在硬盘上有对应的源文件(“老家”)。
- 回收方式:内存不足时,干净页直接丢弃(下次从源文件读回),脏页(修改过)先写回源文件再丢弃。这类内存不会进入 Swap。
匿名页 (Anonymous Pages)
- 内容:程序的堆、栈等动态分配的内存(如
malloc
或new
申请的)。 - 特点:在硬盘上没有源文件(凭空创造)。
- 回收方式:内存不足时,如果这部分内存不活跃,内核会将其写入 Swap 分区,这是它们唯一的"临时避难所"。
- 内容:程序的堆、栈等动态分配的内存(如
内核回收决策流程
当内存紧张时,内核会遵循以下优先级进行回收:
- 首先,回收文件页 (Page Cache):这是成本最低的操作,优先回收。
- 最后,交换匿名页 (Swap Out):只有在回收文件页后内存仍然不足的情况下,才会把不活跃的匿名页写入 Swap。
如何解读内存状态
buff/cache
占用高:通常是好事。表明 Linux 正在充分利用空闲内存加速文件读写,系统会在需要时自动回收。swap
被使用:是一个警示信号。表明物理内存不足以容纳所有活跃程序的匿名内存,需要关注应用是否存在内存泄漏或配置不当。buff/cache
高 +swap
被使用:典型应用内存占用过度的表现。
drop_caches 参数说明
- 手动释放缓存可用于临时解决问题或测试,但生产环境慎用,它可能掩盖真正的内存问题。
- /proc/sys/vm/drop_caches 文件用于手动释放缓存:
- 0:默认,自动管理
- 1:释放页缓存(page cache)
- 2:释放目录项和 inode
- 3:释放所有缓存
提示: 释放缓存前建议先执行
sync
,确保数据写入磁盘。
实践操作
查看内存状态
# 以 MB 单位显示内存使用情况
free -m
查看Swap状态
# 查看当前启用的swap空间(分区或文件)
swapon -s
释放 buff/cache 缓存
# 查看当前内存状态
free -m
# 同步缓存到磁盘
sync
# 只释放页缓存
echo 1 > /proc/sys/vm/drop_caches
# 释放目录项和 inode
echo 2 > /proc/sys/vm/drop_caches
# 释放所有缓存(常用)
echo 3 > /proc/sys/vm/drop_caches
# 恢复为自动管理
echo 0 > /proc/sys/vm/drop_caches
风险提示: 生产环境不建议频繁手动释放缓存,频繁清理可能掩盖应用层内存问题,建议优先优化应用程序内存管理。