Linux 内存管理与缓存机制

内存介绍

当使用 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机制

内存页的两种类型

程序占用的内存可分为两类,内核对它们有不同的回收策略:

  1. 文件页 (File-backed Pages)

    • 内容:程序代码、读取的文件等,即 Page Cache 的主要组成部分。
    • 特点:在硬盘上有对应的源文件(“老家”)。
    • 回收方式:内存不足时,干净页直接丢弃(下次从源文件读回),脏页(修改过)先写回源文件再丢弃。这类内存不会进入 Swap
  2. 匿名页 (Anonymous Pages)

    • 内容:程序的堆、栈等动态分配的内存(如 mallocnew 申请的)。
    • 特点:在硬盘上没有源文件(凭空创造)。
    • 回收方式:内存不足时,如果这部分内存不活跃,内核会将其写入 Swap 分区,这是它们唯一的"临时避难所"。

内核回收决策流程

当内存紧张时,内核会遵循以下优先级进行回收:

  1. 首先,回收文件页 (Page Cache):这是成本最低的操作,优先回收。
  2. 最后,交换匿名页 (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

风险提示: 生产环境不建议频繁手动释放缓存,频繁清理可能掩盖应用层内存问题,建议优先优化应用程序内存管理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值