Vmmem为什么吃内存,.wslconfig管什么
WSL2会把Linux释放的内存当作页缓存留着,而不是还给Windows——所以即使发行版里的程序全都关了,一次大型构建之后Vmmem依然庞大。这是内核的正常行为,不是内存泄漏;但当发行版要和浏览器、IDE以及其他虚拟机共用一台电脑时,上限就该白纸黑字写下来。默认的50%在机器空闲的年代说得通;在一台被五个吃内存应用瓜分的16 GB电脑上,它就是太多了。
方向盘就是%UserProfile%\.wslconfig,虚拟机启动时读取一次——因此每次编辑后都要执行wsl --shutdown才能生效。限制会一次性作用于所有发行版,无法通过这个文件按发行版单独设限。它只影响WSL2:第一代WSL在Windows自身内部转换Linux调用,没有虚拟机,也没有Vmmem可限制。
- memory=6GB — 整台虚拟机(所有发行版合计)的内存上限
- processors=4 — WSL2允许看到的逻辑CPU核心数
- swap=4GB — WSL2可以退守的Linux交换文件大小(默认:内存的25%,上限8 GB)
- autoMemoryReclaim=gradual — 把Linux释放的内存归还Windows的实验性选项(WSL 1.3.10+)
- sparseVhd=true — 允许ext4.vhdx磁盘在删除文件后缩小的实验性选项
逐步设置限制
打开记事本,粘贴节标题[wsl2],在其下写上memory=6GB、processors=4和swap=4GB,然后把文件保存为%UserProfile%\.wslconfig。在保存对话框中,把“保存类型”设为“所有文件 (*.*)”、编码设为UTF-8,否则Windows会悄悄创建一个.wslconfig.txt,而WSL永远不会读它。不带单位的值(比如memory=6)会被按字节解释——GB后缀不是装饰,而是必需。
打开PowerShell或Windows终端,运行wsl --shutdown,等十秒左右,再重新启动你的发行版。在Linux内部,free -h现在显示的是限制后的容量而不是全部物理内存,nproc打印的是你允许的核心数。如果wsl --version显示1.3.10或更新,可以在[wsl2]块下面加上一个[experimental]节,写入autoMemoryReclaim=gradual和sparseVhd=true,再重复一次关闭;在旧版WSL上,先在提权的命令提示符里运行wsl --update。
何时重新审视这些数字
在任务管理器里观察一周日常使用中的Vmmem:浏览网页、写文档和轻量容器4~6 GB绰绰有余,而重度Docker构建或大型JavaScript工具链确实可能需要8 GB以上。调整memory=时按2 GB一档来,不要一步到位;内存16 GB或更少的机器上,至少把物理内存的一半留给Windows。如果存放发行版的磁盘持续膨胀,sparseVhd=true能阻止ext4.vhdx单向扩张。每次Windows功能更新后都复查一下——它们偶尔会替换WSL包并改变其行为。
常见问题与解答
WSL2应该给多少内存?
16 GB的机器上,6 GB足够覆盖日常开发还有富余;总共8 GB内存就守在4 GB,免得Windows开始换页。上限要小步上调,而且只在构建真的因内存不足而失败时。
Linux里全关了,Vmmem为什么还那么大?
内核把释放的内存留作页缓存,不会主动交还Windows。下班时运行wsl --shutdown,或在WSL 1.3.10+上启用autoMemoryReclaim=gradual,让闲置内存自动流回来。
.wslconfig对WSL1发行版也有效吗?
无效。WSL1在Windows自身内部转换Linux调用——没有虚拟机、没有Vmmem,也无从限制。想要限制,先用wsl --set-version <name> 2转换发行版。
继续阅读
联系我们: [email protected]