
Mac M1 上市之后关于虚拟内存的讨论几乎没停过而讨论的焦点就是那个在后台默默写盘的 swap memory。8GB 版本刚铺开那阵子论坛里一堆人晒检测工具截图说自己新机器用了没几天内置存储的累计写入量就冲到了几百 GB 甚至上 TB矛头直指系统在疯狂交换内存页。随后「建议 Mac M1 关闭虚拟内存」这类说法就传开了不少人把关闭 swap 当成了新机到手的第一项优化步骤。但我在几台 M1、M2 机器上反复折腾之后结论没那么简单有些场景确实该管一管 swap可直接关掉这个动作代价往往比收益大。这篇内容会把 swap 的运行机制、M1 统一内存架构下的特殊性、查看与限制 swap 的具体命令、以及我自己踩过的坑全部摊开讲从刚上手的小白到天天泡在终端里的朋友都能拿走能直接落地的东西。1. 为什么 M1 的交换内存会被反复拿出来说1.1 统一内存架构把 swap 推到了台前M1 这一类芯片把 CPU、GPU、神经引擎和内存控制器塞进同一块封装里内存是统一的CPU 和 GPU 共用同一个池子。好处很直观数据不用在两条内存之间来回拷核显性能直接起飞代价是这个池子的容量是焊死的8GB 就永远是 8GB既不能插条内存也不能像早年那样在设置里给虚拟内存划一块固定大小的区域。于是当 GPU 和 CPU 同时抢内存时系统只能靠交换文件把暂时用不上的内存页写到 SSD 上腾地方。这就是为什么同一套 macOS早年的机型上没人天天盯着 swap 看到了 M1 身上它却成了高频话题——不是它的行为变了而是它变成了唯一的泄压阀一旦内存吃紧所有压力都会通过这个口子释放出来任何异常都会被放大到肉眼可见。还有一层原因容易被忽略M1 的内存带宽非常高系统在内存页的调度上比过去更激进压缩和交换触发得也更频繁。这意味着同样的使用习惯在 M1 上看到的 swap 数值可能比老机器更大但未必代表系统出了问题。1.2 「关闭 swap 能保护 SSD」这个说法是怎么来的早些年那波讨论里很多人用第三方工具去读机器内置存储的累计写入量8GB 版本开着浏览器几十个标签页、外接一台 4K 显示器跑个一两天读数就能窜到几百 GB个别夸张的能报出 T 级别的数字。SSD 有写入寿命这是常识于是「swap 在偷偷磨我的硬盘」这条逻辑链看起来就天衣无缝了紧接着就有人提出把负责交换文件的那个后台服务干掉。需要说明的是后来也有观点认为部分工具的读数口径有问题把一些非写入操作也算进了累计值真实消耗并没有截图里那么吓人。但不管怎么讲swap 会写盘这件事是真的只是它的量级跟你日常使用强度强相关和「会不会把盘写坏」之间还隔着好几道数量级直接画等号是不严谨的。我自己的做法是先别慌把机器的实际写入速率记下来连续观察一周再决定要不要动手比看了两张截图就去改系统稳妥得多。1.3 先明确一件事macOS 没有给你标准的关闭开关Linux 上你有一堆旋钮独立交换分区、swappiness 参数、zram 压缩块设备想怎么调就怎么调。macOS 完全不是这个路子。系统设置里压根没有「虚拟内存」这一项sysctl里能改的 vm 相关参数屈指可数交换文件的创建和回收全由内核自己决定。这么设计的原因也不难理解苹果的取向就是让用户别管系统自己权衡。你想干预只能绕到 launchd 层面去停掉那个负责交换文件的服务或者通过内核启动参数去改压缩器的行为两条路都属于非官方玩法系统更新之后随时可能失效甚至把机器搞成开不了机的状态。提示在动手之前先把「怎么恢复」写清楚比如恢复命令、恢复需要的启动方式再开始改。改完当场验证别等到第二天开机才发现进不去系统。2. 把概念捋清楚交换文件、内存压缩和内存压力2.1 三者其实是一条流水线上的三道工序很多人把虚拟内存、swap、内存压缩混成一个东西导致看数据时越看越糊涂。按我的理解它们是一条流水线上的三道工序第一道是内存压缩系统把那些不常用但还不能丢的内存页用算法压一压继续留在物理内存里只是占用变小了第二道是交换当压缩也腾不出足够空间时系统把整页数据写进 SSD 上的交换文件物理内存立刻释放第三道才是内存压力它是系统对「现在到底有多紧张」给出的综合评分参考了压缩率、交换频率、页回收难度等一堆指标。你真正该盯的是第三道而不是第一道的绝对数值。打个生活化的比方桌面就是物理内存抽屉就是压缩区仓库就是 SSD 上的交换文件。手头要用的东西摆桌面暂时不用的塞抽屉压一压抽屉塞满了才往仓库搬。仓库搬得越多说明桌面和抽屉都已经到极限了。2.2 用终端和活动监视器看穿真实占用活动监视器的「内存」标签页里底部有一行「已使用的交换空间」这是最直观的入口。但只看这一个数字很容易误判因为它表示的是当前累计落盘的量不代表系统此刻有多难受。我一般配合终端一起看几条命令就够# 看交换文件的整体用量 sysctl vm.swapusage # 看内存页的统计重点是压缩器相关的几行 vm_stat # 直接给出内存压力的综合判断 memory_pressuresysctl vm.swapusage的输出长这样vm.swapusage: total 4096.00M used 1280.50M free 2815.50M (encrypted)total是当前系统已分配的交换空间总量used是真正写进去的量。注意total会随着负载动态增长不是固定值看到它变大别急着紧张。vm_stat的输出里我关注的是Pages stored in compressor和Pages occupied by compressor这两个前者是压缩后存储的页数后者是压缩器实际占用的物理内存。M1 上的内存页大小是 16KB所以把页数乘以 16384再除以 1024 除以 1024就是 MB 数。这个换算很关键不然你会被几百万的页数吓到。2.3 内存压力对照表什么数值该紧张活动监视器里那条压力曲线是彩色的很多人不知道颜色代表什么。我整理成一张表对着看就行。压力状态图形颜色典型表现建议动作正常绿色swap 用量小幅波动压缩器占用不高不用管继续用偏高黄色swap 持续增长切换应用有轻微迟滞关掉几个不用的后台程序紧张红色明显卡顿、风扇起转、窗口拖动掉帧立即释放内存必要时重启持续红色红色swap 总量不断突破硬盘灯频繁说明配置或工作流需要调整注意绿色状态下偶尔看到几百 MB 的 swap 是完全正常的macOS 会主动把冷数据挪出去这属于预防性动作不是内存不够。3. 关闭 swap 之前先把这三笔账算明白3.1 SSD 写入寿命这笔账到底怎么算先给一组参考量级。现在主流的内置存储按 TBW 算总写入寿命512GB 和 1TB 版本的标称值通常在几百 TB 这个区间具体数值各厂商不同但量级是这样。假设你的硬盘 TBW 是 300TB而你每天的 swap 写入是 20GB一年下来大概是 7TB理论上要四十多年才写到标称上限。就算你重度使用每天 100GB那也是八年往上。所以问题的关键从来不是「会不会写坏」而是「你的写入量到底有多大」。要拿到真实数字可以装一套命令行工具把硬盘的 SMART 信息读出来重点看两个属性累计写入的总字节数和通电时间。不过要提前说明不同机型、不同系统版本能读到的字段不一样有些机器读出的是原始值需要自己换算有些干脆读不到读不到也不用纠结去第三方工具里看看有没有现成的换算结果就行。算出日均写入之后再对照标称 TBW你大概率会发现焦虑是多余的。3.2 关掉 swap 之后系统究竟会发生什么这是最需要讲清楚的一点。swap 被关掉并不意味着内存不够时系统会「优雅地提醒你清理一下」它的真实行为是物理内存耗尽后内存分配请求直接失败正在运行的程序开始被强制结束严重的时候整个图形界面会崩掉屏幕卡住或者直接回到登录界面没保存的工作全丢。这个过程非常突然没有任何缓冲。有人会说那我只压缩不落盘不就行了理论上系统确实有「只用压缩器、不配合交换」的模式但 macOS 并没有把它做成官方支持的选项相关的内核参数在不同系统版本上的表现差异很大有的生效有的完全不起作用而且一旦设置不当可能连恢复都变麻烦。我的态度是这条路可以研究但不适合当作日常配置长期挂在主力机上。更现实的做法是把关闭 swap 当成一个「极限情况下的临时手段」而不是常规优化项。3.3 什么情况下值得动手什么情况下纯属折腾按我自己的经验可以分成三类来看。8GB 机型 明显的内存超载工作流比如同时开大量浏览器标签页、跑虚拟机、剪视频且内存压力长期红色。这种场景下值得做的不是关 swap而是换机器或者彻底改工作流。16GB 及以上机型老实说基本不用考虑这件事把内存管好就已经足够了swap 只是偶尔兜底。纯粹出于对硬盘寿命的担心这类情况我的建议是先去测真实的日均写入量用数据说话多数人测完就不焦虑了。真正值得花时间去做的是减少 swap 的触发频率而不是在它触发之后把出口堵死。4. 实操在 M1 上查看、压制和准关闭交换内存4.1 一组命令看清 swap 现状先把现状摸清楚这一步不能跳。下面几条命令我基本是连着敲的# 1. 交换空间总览 sysctl vm.swapusage # 2. 内存页统计配合 grep 只看关键行 vm_stat | grep -Ei page size|compress|swap|free|wired # 3. 交换文件实际占用的磁盘空间 ls -lh /private/var/vm/ # 4. 内存压力综合评分 memory_pressure第 3 条特别值得说/private/var/vm/目录下会看到swapfile0、swapfile1这样的文件用ls -lh能看到每个文件的大小。系统是按需一个个创建的每个文件通常是 1GB 左右用完回收。如果你看到七八个文件同时存在那说明这台机器长期处于内存吃紧状态。第 4 条memory_pressure会输出一长串重点看最后那行关于系统整体内存状态的判断以及可用内存的百分比。4.2 调整内存压缩策略的正确姿势内存压缩器相关的参数存在vm.compressor_mode这个变量里用下面这条命令看当前值sysctl vm.compressor_mode桌面版系统默认是一个让压缩器和交换协同工作的模式这也是为什么你会看到「压缩内存」和「交换空间」同时存在。网上流传过把它改成「只压缩不交换」的做法但我不建议在没有完整回滚方案的情况下尝试原因有三一是不同系统版本的取值含义并不统一抄来的数字未必对应你要的模式二是这个参数改动可能影响系统稳定性尤其在内存本来就紧张的机器上三是它跟硬件、固件版本都有关系。如果你确实想试务实的流程是这样# 记录当前值方便回滚 sysctl vm.compressor_mode # 设置启动参数仅作为示例务必先确认自己的系统版本是否支持 sudo nvram boot-argsvm_compressor2 # 重启后验证 sysctl vm.compressor_mode # 需要回滚时 sudo nvram -d boot-args注意nvram这类操作属于内核级启动参数部分机型和新版本系统会直接忽略它。设置完之后必须重启并立刻验证不要假设它一定生效。如果验证发现没有变化说明这条路在你这台机器上走不通及时回滚别反复试。4.3 找出真正的内存黑洞从源头减少 swap与其纠结怎么关出口不如把吃内存的大户揪出来。活动监视器的「内存」标签页按内存占用排序能看个大概但更细的信息在终端里# 按内存占用列出前 15 个进程 ps aux | sort -nrk 4 | head -n 15 # 看某个进程的详细信息 ps -o pid,rss,vsz,%mem,command -p 进程IDRSS是常驻内存也就是真正占着物理内存的部分%MEM是占总内存的百分比。这两个指标配合看很容易发现异常进程。浏览器是重灾区尤其是标签页开得多的时候每个标签页都可能是一个独立进程其中一个内存泄漏就能吃掉好几个 GB。我自己的习惯是给浏览器装一个标签页休眠类的扩展把长时间不看的页面挂起效果立竿见影。另外就是那些后台常驻的小工具单个看着不起眼十几个叠起来就是 1 到 2GB8GB 机型上这个数字非常致命。4.4 限制单应用与降低后台常驻的实战配置把内存省下来这件事靠的是习惯加上一点点配置。分享几个我一直在用的做法。第一登录项能砍就砍。系统设置里的「通用」→「登录项」把那些开机自动启动、但你一周都用不上一次的程序全部移除。这一步在 8GB 机型上通常能省出几百 MB 到 1GB。第二浏览器只留一个主力。同时开两三个浏览器是最浪费内存的用法内核不共享缓存也各存一份。第三虚拟机和容器用完就退。这类程序一旦启动就会预留大块内存挂着不用等于白占。至于在 M1 上装 Windows 虚拟机这类操作本身就是内存消耗大户跑之前先确认剩余内存是否够分。第四养成定期重启的习惯。macOS 长时间不重启内存碎片和缓存会越积越多重启一次往往能立刻改善压力状态。第五善用内存清理命令。装了命令行开发工具之后会有一个purge命令它能强制回收一部分可回收的缓存# 强制回收文件缓存需要管理员权限 sudo purge提示purge回收的是磁盘缓存这一类可回收内存不会动正在运行的程序占用的内存所以别指望它能解决所有的内存紧张它更像是按下一次「刷新」。5. 我的踩坑记录与问题速查表5.1 关掉 swap 之后我把机器搞卡死的那次讲个真实经历。早些年我在一台 8GB 的机器上按网上教程停掉了交换文件服务重启之后跑了几天的日常使用感觉还挺好sysctl vm.swapusage显示用量为零心里那叫一个舒坦。直到有一次我一边开着视频会议一边在浏览器里查资料还顺手打开了一个比较大的表格文件内存瞬间打满整个系统在没有任何预警的情况下直接黑掉会议断了未保存的内容也没了。重启之后我老老实实把服务恢复了回去。那次之后我彻底想明白了swap 是系统留给你的最后一道保险它平时不出声但关键时刻能救命。把保险拆掉换来的只是账面上好看的数字。还有一次更隐蔽的坑我改了一个内核启动参数之后忘了记录原值结果系统更新之后行为变了折腾了半天才回滚。从那以后我养成一个习惯任何系统级改动之前先把命令和原值写在备忘录里。5.2 常见疑问与排查对照表现象可能原因排查与处理swap 用量一直是零内存充足系统没必要写盘正常不用管swap 总量突然涨到几 GB有程序短时大量占用内存看活动监视器排序找出大户关掉 swap 后应用频繁闪退物理内存耗尽分配失败立即恢复服务并重启内存压力长期红色硬件配置与工作流不匹配削减后台程序或升级机型硬盘写入量增长很快长期高负载触发频繁交换测日均写入量评估是否在合理区间恢复命令执行后没变化系统版本不支持该参数换回官方默认行为别硬刚5.3 几台机器的长期观察数据我手上有几台不同配置的机器用来做长期对照数据不一定有普适性但能说明趋势。配置典型使用场景日常 swap 用量内存压力8GB浏览器十几标签页 文档500MB - 2GB 波动经常黄色8GB上述 视频会议2GB 以上频繁触发偶尔红色16GB浏览器几十标签页 开发工具200MB - 1GB基本绿色16GB上述 虚拟机1GB - 3GB黄色为主8GB 和 16GB 之间的差距在最重的场景下非常直观。如果现在让我给建议预算允许的话内存尽量往上选一档这比任何软件层面的优化都管用。6. 不同人群该怎么选一份可以直接抄的配置清单6.1 8GB 机型用户的日常守则8GB 是 swap 问题最集中的配置因为它的余量本来就小。我的建议按优先级排先把登录项清干净只保留真正需要的然后浏览器收敛到一个标签页用休眠扩展管理接着把不用的虚拟机、容器、大型编辑器全部退掉别以为最小化了就不占内存最后养成每周重启一次的习惯。这一套做完多数人的内存压力能明显改善。至于关 swap我的建议是别关改完之后你会发现系统稳得多。如果做完这些还是长期红色那就说明工作流已经超出这台机器的能力了这时候需要面对现实而不是继续在系统层面抠。6.2 16GB 及以上用户其实不用太焦虑16GB 及以上的机型日常办公和轻度开发场景下swap 用量通常都很小内存压力绝大部分时间在绿色。这类用户完全没必要看那些「关闭虚拟内存」的教程跟着做反而是给自己找麻烦。真正需要关注的是极端场景比如同时跑多个虚拟机、做大体量媒体处理这时候看一眼压力曲线就够了黄了就去关几个程序比改系统参数靠谱得多。6.3 长期重度负载用户的取舍如果你长期跑重负载任务swap 用量大是必然的这时候要做的是两件事第一把机器的散热和供电环境弄好高负载下温度上去了系统调度会更保守第二定期记录硬盘的累计写入量通过趋势判断是否在正常范围。只要日均写入量在一个合理的量级内就不用为寿命焦虑。真到了写不动的那天那也是几年之后的事了届时换机比现在折腾系统划算得多。最后分享一个我自己的小习惯每隔一段时间跑一次sysctl vm.swapusage和vm_stat把关键数字记在一份表格里。数据攒到十几条之后机器到底在什么工况下会吃紧、什么操作会触发大量交换一目了然。这比任何一篇文章里的建议都更贴合你自己的使用方式也更能帮你判断那台机器到底还能陪你走多远。