macOS关闭虚拟内存
前言
macOS关闭虚拟内存(交换内存 swap memory) 以减少SSD磨损,延长SSD寿命(本文含macOS硬盘写入量查询方法)
关闭后效果:

由于macOS特性,即使你按照本文操作了,依然可能使用swap,但比之前更少.
Mac OS X / IOS 内存管理机制
OS X的内存管理与Unix是很类似的,内存管理的思想都是尽可能的使用内存,内存是计算机最宝贵的资源,读写速度快过硬盘
例如: 看上面效果图,你可能会觉得我的64G内存系统应用就用掉10G以上,这不是大大的浪费吗?
实际上,这个是很正常的,为什么呢?
在OS X中内存分为这几种状态:
- active
 - inactive
 - free
 - wired
 
wired
代表联动内存,这是系统核心占用的,无法移动到硬盘,必须保留在RAM里,联动内存大小取决于当前应用程序。
active
代表当前正被使用或刚被使用过的内存
inactive
表示这些内存中的数据是非活跃的,现在没有在使用,但是最近刚被使用过。比如刚刚关闭了一个Mail应用,它的内存并不会立刻被释放掉,而是变为Inactive,这样当我们再次打开它时,就可以快速打开,而不需要从比较慢的硬盘再打开。而在没有再次打开Mail前,启动其他应用是可以用这块inactive的内存的,它就像可用内存一样,可供其他应用程序使用,但是可以在其他应用程序占用它前,使得打开Mail更快。
free
没有使用的内存
例如我的64G内存

事实上,使用OS X/linux等类Unix操作系统时,是不需要担心内存占用太多的,因为内存就是要充分使用的。
当你有少量free内存,大量inactive内存时,表明此时系统运行在最佳状态,反而在刚开机时大量free时会比较慢。
只有当free和inactive都很少时才说明内存不够用了。但事实上,得益于SSD和M1 MAX的强大,即使CPU压缩内存到硬盘,再从硬盘取回数据,这之间的时间间隔也非常小,用户几乎很难察觉出来,所以MAC用户无需担心内存使用问题.
我尝试过将CPU和内存拉满,但即使这样,系统UI也没出现明显卡顿.
得益于OS X 系统采用了 Unified Buffer Cache,MAC的空闲内存会被用来加速文件访问.即上图中的压缩内存.
在日常使用中,可以做到随时开随用,流畅无卡顿.
为什么要关闭?

我们都知道,SSD写入有容量限制,一旦写入达到了设计的最大写入容量,这SSD也就报废了,
例如 512G 的 SSD 寿命一般 300T,写入量(一礼拜2T)就算刻意每天都很注意的用 2-3年你固态也写满报废了
然而还不能自己换,高度集成化,固态坏了就要全套板子一起换
256g固态的理论寿命是150TBW,一个月10T写入的话
理论来讲你只能用一年零三个月,实际情况永远是主控先挂 全盘GG
1.启动虚拟内存(默认):无论怎么样都会使用虚拟内存,除非你的内存特别大,目的是为了防止在突然打开一个超大的文件时,导致需要重新处理内存与虚拟内存。所以默认使用虚拟内存,尽量让出大部分物理内存。
2.关闭虚拟内存(需要手动):默认不使用虚拟内存,但经过我观察,似乎是超过预警阈值(内存GB-2GB的样子)就会开始使用虚拟内存,我猜测目的是为了系统的稳定性
如何关闭虚拟内存?
关闭系统完整性保护机制
关闭虚拟内存
首先关闭系统完整性保护需要进入recovery OS,Apple芯片进入模式与intel不同.
在电脑完全关机的情况下,一直按着电源键不放,直到提示你正在进入启动选项就可以放手了.之后点选项,选择用户,输入密码后
左上角有一排的菜单,找到终端打开它,输入:
1  | csrutil disable # 关闭sip,开启则为enable  | 
输入yes,之后密码,然后reboot重启.
重启电脑后打开终端,输入:
sysctl -a vm.compressor_mode 来检查现在的内存模式,默认为 4
- 1 代表不压缩内存且不启用 swap
 - 2 代表压缩内存但不启用 swap
 - 3 代表不压缩内存但启动 swap
 - 4 代表着压缩内存并启用 swap
 
运行命令
1  | sudo nvram boot-args="vm_compressor=2 $(nvram boot-args 2>/dev/null | cut -f 2-)" # 这条命令作用是将vm_compressor=2插入到nvram boot-args参数中,如果已存在,那么请修改参数,而不是插入.  | 
使用指令sysctl -a vm.swapusage可以查看虚拟内存使用情况.
重启, 检查swap是否已关闭.
1  | sysctl -a vm.compressor_mode  | 
如何查询Mac硬盘写入量
查看硬盘写入量是通过一个叫 smartctl 的应用实现的
安装 HomeBrew
通过 Mac os 上的软件包管理工具 HomeBrew 来进行安装 (若已安装则跳过即可)
官网给出的方法十分简单,只需要在终端中粘贴如下代码即可:
1  | /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)”  | 
若出现
1  | raw.githubusercontent.com port 443: Connection refused  | 
则说明终端没有过代理(需科学上网)
简单的方法就是换源,终端输入以下代码即可:
1  | # 设置homebrew-core镜像  | 
等待安装完成后,需要设置环境变量,在终端中接着输入以下代码即可:
注意:如果你确定使用的终端是zsh(一般默认是zsh),那么直接执行下面代码,否则请将两段的末尾的 zshrc 改为bashrc即可
1  | echo export PATH=/opt/homebrew/bin:$PATH >>... |