这块M1 MacBook Air是首发入的,8GB统一内存,日常就是写文档、开十几个Chrome标签页、偶尔挂个微信再跑个本地开发服务。系统用着用着,Activity Monitor里的“Swap Used”就稳稳停在3GB上下,打开活动监视器一看,内存压力长期是黄橙橙的。网上铺天盖地的帖子都在说:Mac M1建议直接把虚拟内存(swap memory)关掉,理由是交换文件频繁读写会加速SSD磨损,还会拖慢整机速度。听起来头头是道,但真到了要动手的时候,我心里一直犯嘀咕——关掉swap之后系统会怎样?内存不够了怎么办?这个操作在M1上到底靠不靠谱?
于是我把这个念头压了半年,直到有次手头正好多了台16GB的M1 Mac mini,才终于有条件认认真真做了一轮实测。结论先放在前面:“建议关闭swap”这个说法,是有前提的,而且前提很苛刻;对大多数8GB/16GB的M1用户来说,关掉swap带来的风险和副作用,远远大于它那点理论上的SSD保护收益。下面把原理、操作、实测结果和替代方案一条条拆开讲清楚。
1. 先搞明白:M1的swap值为什么看起来那么大
1.1 统一内存架构让swap的“存在感”变高了
M1用的是统一内存架构,CPU和GPU共用同一块物理内存,不再像Intel Mac那样CPU内存和显存分离。好处是数据不用在CPU和GPU之间来回拷贝,效率高;坏处是内存一旦不够,GPU要显存、CPU要计算内存,两边抢起来压力非常大。
macOS从Big Sur开始,对swap的调度比以前积极得多。以前的macOS通常优先压缩内存,压缩不行了才考虑交换;到了Big Sur,系统会提前把一些不活跃的内存页(memory pages)写进/private/var/vm下的swapfile,给活跃进程腾位置。所以M1用户打开活动监视器,看到“交换内存已使用”动不动就几个GB,是常态。
这里有个容易误读的点:swap占用高,不代表SSD一直在狂写。macOS的交换是分页级别的,只有被“换出”的页面才涉及真实IO;页面在内存和SSD之间搬来搬去,搬一次就是一次写入。很多应用启动时创建了大量一次性页面,被标记为可弃置(clean),这些页面被换出时根本不会写SSD,直接丢弃就行。所以账面数字是4GB还是8GB,跟你SSD的实际磨损没有线性关系。
1.2 账面Swap数字不等于真实磨损
想判断SSD到底被写了多少,别盯着活动监视器里的Swap Used,要看这几个指标:
vm_stat里的Pages swapped in和Pages swapped out,这是从开机累计的真实交换页数。smartctl -a disk0里的Total Data Written(需要安装smartmontools,部分M1 SSD不一定暴露该字段)。iostat -d disk0做连续观察,看实际写入速率。
我在8GB的M1 Air上观察过:swap used显示3.6GB时,连续半小时只是打字、开会、看网页,pages swapped out的增长量只有几百MB,很多时间段的swap写入速率是0。也就是说,系统把页面换出后,并不会频繁把同一页反复写SSD,除非内存压力持续维持在极高水平。
所以第一波结论就是:光看见swap数字大就着急,是被表象误导了。真正的判断依据是内存压力颜色、swap写入速率和应用卡顿频率,而不是Swap Used这个存量数值。
2. “建议关闭swap”这个说法是怎么火起来的
2.1 起因:SSD寿命恐慌
2020年底M1刚出来时,有不少用户用smartctl查内置SSD的Total Data Written,发现半年内写入了几十TB,对比第三方软件给的健康预估寿命,气氛顿时紧张起来。那段视频和帖子传播很广,核心推理是:swap频繁写SSD,SSD迟早报废,所以应该关掉swap。
这个恐慌不能说完全没道理。当时部分静态资源确实偏高,尤其8GB丐版机型,在运行内存密集型任务时,交换写入量确实比Intel Mac大不少。但“swap写入大”不等于“必须关闭swap”,中间缺了一条逻辑:你得先确认自己每天的真实写入量,再对照SSD的质保和寿命预期,才能做出判断。
M1的SSD焊在主板上,换了就是整机换,所以大家的焦虑我能理解。但一个容易被忽略的事实是:Apple在后续的macOS版本里反复调整了memory management策略,尤其是内存压缩、交换阈值、app压缩这三者的配合,同样的工作负载在最新系统上比Big Sur初版少产生大量swap写入。换句话说,你担心的那个问题,系统厂商已经在用软件方式慢慢缓解,你一刀切关掉swap反而是釜底抽薪。
2.2 “关闭swap”的建议,往往省略了前提条件
我在很多帖子里看到类似说法:“我32GB内存的M1 Pro,关掉swap后速度飞起。”这个观点有没有参考价值?有一点,但只对32GB以上内存的用户成立。你让8GB内存的用户也去照做,就是误导。32GB内存的用户,日常办公可能确实用不到swap,关掉之后没有即时副作用。8GB用户关掉swap,内存一旦扛不住,系统连最后的缓冲垫都没有了,结果就是应用秒杀、系统重启、未保存文档直接没了。
还有一个被轻描淡写的细节:从Big Sur开始,com.apple.dynamic_pager.plist这个负责管理动态交换文件的LaunchDaemon,已经不是你想卸载就能顺利卸载的。关SIP、卸载daemon、删除swapfile,一套操作下来,下一次系统更新或者某次内存压力峰值,系统照样可能panic。我在16GB的Mac mini上甚至见过daemon卸载后,系统在没有任何警告的情况下自动重建swap文件,等于白忙活。
所以我给各位的第一条建议是:看到“建议关闭”这四个字,先看对方的硬件配置、使用场景、实测周期,再决定要不要跟进。技术社区里真正的“建议”,应当连同风险一起写清楚。
3. 如果非要试:M1上关闭swap memory的实操记录
考虑到很多读者就是想亲眼看看关闭swap是什么效果,我把这一节的完整实验过程放出来。请务必先读完前提条件,再考虑要不要复现。
3.1 动手前的三个前提:备份、SIP、恢复方案
关闭swap属于系统底层改动,不是改个偏好设置,所以操作前必须做好三件事:
- Time Machine完整备份。我测试时用外接SSD做了全量备份,以备随时回滚。
- 记录基线数据。在终端执行
sysctl vm.swapusage和vm_stat,把当前swap总量、已用量、page大小、从开机到现在的swap进出量截图保存。 - 确认能进恢复模式。M1进恢复模式是关机状态下长按电源键,直到出现“正在载入启动选项”,再点“选项”。如果连恢复模式都进不去,绝对不要开始,否则遇到问题没法关SIP/重装系统。
3.2 实测操作命令与系统反应
需要说明的是,我的测试机是macOS Ventura,M1 Mac mini,16GB内存。操作路径如下:
首先关闭SIP(System Integrity Protection),否则系统不允许改动系统卷下的LaunchDaemon。M1进恢复模式,打开“终端”,执行:
csrutil disable重启后,在正常系统中执行:
sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.dynamic_pager.plist这条命令的作用是卸载动态页式文件管理守护进程,理论上系统就不再创建和使用/private/var/vm/swapfile。执行后终端不输出任何内容,命令直接回到提示符,表示卸载成功。
接着删除已经存在的交换文件。M1的swap默认在/private/var/vm/,执行:
sudo rm -rf /private/var/vm/swapfile*注意,如果系统还在往swap写入数据,rm可能报“Resource busy”。我实测在卸载daemon后立刻删,是可以删掉的;但如果你在图形界面里还开着大量应用,系统随时可能触发交换,就会删不掉。
最后重启:
sudo reboot重启后检查swap状态:
sysctl vm.swapusage正常情况下输出类似vm.swapusage: total = 0.00M used = 0.00M free = 0.00M (encrypted),这就是关闭成功的信号。
3.3 怎么验证swap有没有真的被关掉
只靠sysctl一条命令还不够。我习惯多重验证:
sudo fs_usage -w -f filesys | grep swap这条命令实时监控文件系统调用,如果swap关了,就不会看到任何对/private/var/vm/swapfile的读写。如果还能看到,说明daemon其实又自发启动了。
另外可以连续观察一段时间:
sudo iostat -w 5 -d disk0看设备写入速率。如果只是开几个App,KB/t和MB/s都非常低,基本能确认没有swap写入。注意不要用Windows的虚拟内存逻辑去套机械盘、系统盘、页面文件的机制,特别是看到“swap文件还在”就以为又失败了——只要没有实际写入,文件残留只是占着磁盘空间,不影响禁用效果。
3.4 我踩过的三个坑
第一个坑:系统更新后swap会悄无声息地回来。我关闭swap后正常用了三天,第四天弹出一个macOS更新提醒,更新完再查,/private/var/vm/swapfile0又出现在那了。原因是更新过程会重置LaunchDaemon加载状态,-w参数记下的禁用标记也会失效。所以要长期保持关闭,每次系统更新后都得重新执行一遍。
第二个坑:低内存负载下“一切正常”的错觉很危险。16GB内存的机器,只开浏览器和编辑器,确实看不出任何异常。我为了测极限,同时开了Final Cut Pro、Docker、十几个Chrome标签页,内存压力飙到红色,系统先是卡死十几秒,然后无响应,最后直接重启,登录后看到一份panic report。重启后daemon还没自动load回来,swap还是0,但已经没有任何数据可救了。
第三个坑:FileVault开启状态下,删除swapfile的时机很敏感。开FileVault的机器,swap文件是加密的,系统对rm操作的管理更严格。我在一台开FileVault的机器上执行删除命令,反复提示Resource busy,后来发现是有个后台进程仍在往swap里写少量数据,必须等内存压力完全降下来才能删成功。所以如果你开了FileVault,最稳妥的顺序是:先退出所有应用,再卸daemon,等两分钟,再执行删除。
4. 关闭swap后系统在靠什么硬撑:内存耗尽时的真实表现
4.1 内存压力低时,体验确实不差
我必须承认,在某些低负载客观测试里,swap关闭后的体验是“看起来挺香”的。16GB内存只跑轻量任务时,swap used为0,系统响应极快,SSD写入几乎为0,活动监视器内存压力长时间保持绿色。如果你的电脑是32GB或64GB内存、每天只做文字处理、浏览网页、看视频,那么关闭swap可能真的一辈子也碰不到内存耗尽的情况。
但问题在于,你买电脑不是为了只在低负载下使用。真到了某个项目需要开着一个大数据库、一个IDE、一个浏览器,内存瞬间打满的时候,你才会意识到swap这个“安全阀”意味着什么。
4.2 内存吃紧时会发生什么:从杀应用到系统panic
macOS对内存耗尽的处理是有层级的,正常开启swap时,系统会先用压缩内存,再写swap,继续不够才轮到杀掉后台应用。一旦swap被关闭,压缩内存就是最后的防线。
当内存压力进入红色区间,系统会启动“jetsam”机制,清掉可回收的后台进程和窗口。表现就是你切到后台的应用突然消失,切回来要重新加载。接下来,如果前台应用还在涨内存,操作系统没有任何交换空间可用,内存分配请求只能直接失败。某些App对这种错误处理不好,会闪退,留下一句没有上下文的错误报告;严重的时候,内核内存无法释放,就直接panic重启。
我在实测里观察到的临界点很有意思:崩溃后系统日志里连续出现低内存事件,每次持续十几秒,然后黑屏自动重启。整个过程没有任何“内存不足,请关闭应用”的友好提示,跟Windows那种弹窗完全不同。macOS的假设是swap永远可用,你把swap拿掉,相当于把安全绳剪了。
4.3 适合长期关闭swap的极少数场景
严格来说,我认为只有两类人可以长期关闭swap:
- 物理内存足够大(64GB以上),且能保证未来一年内的最高负载也不会逼近物理内存上限。
- 电脑只做单一任务,例如固定运行一个不吃内存的容器服务,且完全不需要图形界面和后台多任务场景。
这两类人有一个共性:他们能准确说出自己工作负载的内存峰值。如果你做不到,就说明你没有资格做这个决定。我劝各位放弃在8GB/16GB的M1上长期关闭swap的幻想。
5. 我更推荐的路:不关swap,但把交换频率和内存压力压下去
与其冒险关swap,不如换一个思路:从源头减少swap发生的频率,这才是绝大多数人真正需要的方案。
5.1 先判断自己是不是真的需要焦虑
打开活动监视器,切到“内存”页,看底部“内存压力”彩色图,这是苹果官方给出的综合判断:
- 绿色:内存充足,swap使用高也只是系统预加载,不用管。
- 黄色:内存有一定压力,如果swap写入率持续居高,才需要优化。
- 红色:内存持续吃紧,这时不是关闭swap的时机,而是增加物理内存或降低负载的时机。
我习惯再用命令行补两个指标:
sysctl vm.swapusage vm_stat | grep -E "Pages swapped in|Pages swapped out"这两个命令能告诉你从开机到现在,系统到底真实交换了多少页面。如果Pages swapped out增长非常缓慢,说明当前的使用方式没问题。
5.2 定位吃内存的大户
内存优化第一步,是找到谁在吃内存。我常用这条命令按内存占用排序:
ps -A -o pid,rss,comm -r | head -20RSS列是常驻物理内存,单位是KB。不过这条命令看不到显存部分,只看CPU侧的常驻内存。想看得更全,还是活动监视器的“内存”标签页,按“内存”列排序更直接。
接下来可以观察IO频率,确认是不是某个App在制造大量swap写入:
sudo fs_usage -w -f filesys | grep -E "swapfile|VM"如果发现某个App每次启动都伴随大量swap写入,那说明它启动时创建了大量页面,应该在用完它之后及时退出,而不是一直挂在后台。
5.3 把交换频率降下来的实用手段
第一,关掉不必要的开机自启动项。M1开机很快,但自启动App会在开机后几秒钟内抢占内存,触发一轮交换。系统设置→通用→登录项,把不用的全部删掉。
第二,让后台应用真正退出,而不是“最小化”。macOS的“提高内存压力”往往来自一堆所谓挂后台的App。你以为微信只是挂后台,它可能在后台跑着几十个渲染进程,内存占用轻松上1GB。不用就Cmd+Q,这是最简单也最有效的优化。
第三,谨慎使用各类“一键内存清理”工具。那些在菜单栏上放个清理按钮的工具,通常是调用purge命令强制回收内存,这会让系统放弃对内存缓存的调度,反而增加之后磁盘IO和swap频率。我见过很多所谓内存优化工具,效果还不如手动关两个后台进程。
第四,保持macOS更新到较新版本。Apple一直在调优内存压缩和swap策略。我实测同样开十个Chrome标签页加一个Electron应用,Ventura比Big Sur初版产生的swap写入明显更少。这不是玄学,而是系统层面的调度优化。
第五,Chrome和Safari这类浏览器,开启标签页休眠功能。浏览器通常是内存大户,让不活跃标签页自动休眠,能省下几个GB的内存。Safari自带“标签页休眠”,Chrome可以用内置的Memory Saver。
5.4 一个我常用的兜底习惯:每月重启一次
M1从待机唤醒很快,很多人一两个月不重启,系统长期运行后内存碎片和泄漏会慢慢堆积,swap使用也越来越高。我现在的习惯是每两周或每月至少重启一次,很多莫名其妙的卡顿就这样解决了。这招不玄乎,但真的有用。
6. 关于内存和swap,买新Mac时最好一次想明白
6.1 不同内存容量下的典型表现
帮朋友选购Mac时,我通常会给出这张参考:
| 场景 | 推荐内存 | 理由 |
|---|---|---|
| 轻度办公、网页浏览、视频播放 | 16GB | 8GB在M1上属于能开机但未来三年会折磨人的水平,16GB基本够用 |
| 前端/后端开发,本机跑Docker和IDE | 16GB-32GB | Docker容器可以轻松吃掉4GB以上内存,32GB更从容 |
| 视频剪辑、3D建模、大型虚拟机 | 32GB起步 | 这类负载会同时占用CPU和GPU内存,swap只是杯水车薪 |
| 笔记本长期外接多屏同时跑重型任务 | 64GB | 预算允许时一步到位,避免后期无法加装的遗憾 |
M系列芯片内存焊在主板上,后期没法升级,所以选内存标准就是:按未来三年最高负载预估,再加8GB余量。内存买小了,之后想靠关swap续命是饮鸩止渴。
6.2 我最终的结论
聊了这么多,回到标题本身:“建议Mac M1关闭虚拟内存(swap memory)”。我的态度很明确:不推荐绝大多数人这么做。关闭swap在M1上不是一个系统设置项,而是通过卸载系统守护进程、关闭SIP换来的“伪优化”,代价是失去系统在极端情况下的最后一道内存保护。实测下来,低负载时它无害,高负载时它可能直接让你重启电脑,丢掉未保存的工作。
如果你的swap使用量看着焦虑,请先从减少后台进程、升级系统、合理选配内存这些方向入手;如果你已经买了8GB的M1,最大的优化其实是管好自己同时打开的应用数量,而不是去底层拔掉安全绳。
最后分享一个我自己的小习惯:在活动监视器的Dock图标上右键,选择显示“内存压力”,这样Dock图标会持续用颜色反馈当前内存状态。绿色就不用管,黄色偶尔瞄一眼,红色立刻开始关应用。这个办法花不了十秒钟,但比你翻论坛找“关闭swap教程”靠谱得多。