看内存压力,别看已用内存
打开 活动监视器,点内存,大多数人第一眼看的就是 已用内存,这个数字几乎总是很高,一台 48 GB 的 Mac 开着浏览器和编辑器,轻松就能停在 40 GB,看起来像个要解决的问题。
其实很少是,macOS 会把买来的内存用满,因为空着的内存什么都不干,系统会用文件缓存把它填满,把最近用过的页留在里面,Mac 是不是真的缺内存,要看同一窗口底部的 内存压力 图,已用内存看着吓人的时候,这条图通常还是绿色。
短答案: 别管「已用内存」,看内存压力图,绿色就说明占用几乎满了也不是问题,没什么要修的,黄色或红色,下面三个计数器会告诉你为什么。
为什么「已用内存」是个错数字
macOS 把空闲内存当成浪费,最近读过的文件会留在内存里,因为从内存再读一次几乎不花钱,从磁盘再读一次就要花钱,应用一旦需要这块内存,缓存立刻就会被丢掉。
活动监视器 的内存标签里能看到拆分:
| 行 | 是什么 | 要不要担心 |
|---|---|---|
| 应用程序内存 | 应用已经分配并且正在用的页 | 只有某个应用明显离谱时才要 |
| 联动内存 | 内核不能换出的页 | 很少能动手处理 |
| 已压缩 | 为腾地方被压过、仍在内存里的页 | 一点是正常,很多才是信号 |
| 已缓存的文件 | 因为内存空着才留下的文件数据 | 从不,这是系统在干活 |
「已用内存」把其中好几项加在一起,包括随时会交回去的已缓存文件,所以一台健康的 Mac 上,这个数字会爬到接近满载,然后停在那里。
改看压力
内存压力图是 macOS 自己的判断,看现在能不能既满足分配又不伤性能:
- 绿色。 请求从空闲或可回收内存里就能满足,已用内存不管多高,都不用管。
- 黄色。 系统在靠压缩和驱逐跟上节奏,还在干活,但余量没了,再来一次大分配就要付出代价。
- 红色。 分配在等内存先被腾出来,转圈和切应用变慢就是从这里来的。
命令行也能读:
memory_pressure
值得看的是最后一行:
System-wide memory free percentage: 74%
同一条命令还会打出推导这个百分比用到的原始计数器,包括页数和交换活动,想要证据而不是颜色的时候有用。
颜色背后的三个信号
压力变黄或变红时,三个数字能解释原因,要一起看,单独看任何一个都可能误导。
已用交换空间。 装不下才被写到磁盘上的内存。
sysctl vm.swapusage
vm.swapusage: total = 6144.00M used = 4568.19M free = 1575.81M (encrypted)
交换空间不为零本身不是故障,macOS 即使内存宽裕,也会把很久没碰过的页换出去,在 SSD 上这么做的代价很小,真正的信号是交换空间又大、又在工作过程中持续增长。
压缩活动。 换到磁盘之前,macOS 会先在内存里压缩页。
vm_stat | grep -i compress
Pages stored in compressor: 1945157.
Pages occupied by compressor: 389440.
Decompressions: 82848340.
Compressions: 163587315.
用 Mac 的时候 Compressions 涨得很快,说明系统在抢空间,开机好几周的机器上,历史累计很大,单独看没有意义。
负载下的换入。 从磁盘把页读回来,就是感觉到的卡顿,一台同时在压缩、交换、换入的 Mac,就是典型的转圈状态。
找出是哪个应用
把 活动监视器 的内存标签按内存列排序,看最上面几行,不用看整张表,答案通常是下面四种之一:
- 开了很多标签的浏览器。 每个渲染进程都是独立进程,浏览器的总量会摊到很多行上,Chrome 自己的任务管理器在「窗口」菜单下,能把内存归到单个标签和扩展,具体看 Chrome Helper 占用很高的 CPU 和内存。
- 虚拟机或容器运行时。 它们会提前预留内存,所以这个数字是配置选择,不是泄漏。
- 长时间开着的创作或开发应用。 一次使用里内存稳步上涨、再也下不来,值得告诉开发者。
- 不认识的进程。 杀掉之前先认出来,具体看 怎么排查不熟悉的进程。
退出应用就行,系统还撑得住的时候,强制退出一个只是占用大的进程,会丢掉没保存的工作,什么也换不来。
没用的做法
- 内存清理类应用。 释放内存就是丢掉系统故意建好的缓存,占用条看着好看了,Mac 反而变慢,因为所有东西都要再读回来。
- 定时跑
sudo purge。 它是为跑基准测试清文件缓存用的,同一个错误换成了命令,名字虽然像,但跟磁盘上的可清除空间没关系,具体看 可清除空间。 - 关掉马上又要打开的应用。 哪些空闲应用该压缩,macOS 比一套固定流程判断得好。
- 关掉交换空间。 交换空间是安全阀,拿掉之后被杀掉的就是应用。
什么时候答案真的是加内存
Apple Silicon 用的是统一内存,买完就不能加,所以值得先诊断,别靠猜。
日常工作里压力一直黄或红,一次使用中交换空间稳步上涨,占最多的又都是必须同时开着的东西,这时才该买更多内存,压力是绿色,只是被「已用内存」吓到,加内存感知不到任何变化。
监视器摆在哪
Mole 把内存压力和 CPU、温度、以及驱动它们的进程放在一起看,慢的 Mac 能在一个地方看清原因,不用翻四个窗口,它把压力当成头条,因为这个数字能预测 Mac 用起来怎么样,也从来不会替你释放内存。
常见问题
Mac 上已用内存高是坏事吗?
不是,用量高但压力绿,是 macOS 把可用内存拿来做缓存,这是设计如此,健康指标是压力,不是用量。
交换空间多大算太多?
没有跨机器都成立的阈值,看实际工作时的趋势,别看绝对值,压力黄或红的时候交换空间稳步上涨才是问题,开机好几周的机器上几个 GB 通常不是。
内存清理应用有用吗?
它们做了宣传里说的事,这才是问题,丢掉缓存会让空闲内存数字涨上去,接下来几分钟反而更慢,有东西需要的时候,macOS 自己就会回收内存。
压力是绿色,Mac 为什么还慢?
那就不是内存卡住了,去看 CPU、过热降频或磁盘,从 Mac 为什么这么慢 开始,那里按顺序过一遍瓶颈。