wsl2的vmmem进程内存占用过高源于未设内存上限,应通过.wslconfig全局配置限制内存(如memory=12gb),并执行wsl --shutdown使配置生效;也可用wsl --manage动态调整单个发行版内存;关闭终端后需手动运行wsl --shutdown释放内存。

Win11运行WSL2后vmmem进程持续占用十几GB内存,导致主机卡顿、浏览器反复崩溃、IDE响应迟缓,根本原因是WSL2虚拟机未设内存上限,Linux内核会不断向Hyper-V申请页帧却从不主动释放。
通过.wslconfig全局限制所有WSL2发行版内存
这是最稳定、兼容性最好的方式,适用于所有WSL2发行版,且一次配置永久生效。
第一步:按下 Win + R 打开“运行”窗口,输入 %UserProfile% 并回车,进入当前Windows用户主目录。
第二步:在该目录下新建一个纯文本文件,命名为 .wslconfig(注意开头是英文点号,不是中文句号;若系统隐藏扩展名,请务必确认实际文件名不含.txt)。
第三步:用记事本或VS Code打开该文件,写入以下内容(memory值必须小于物理内存总量的70%,例如32GB主机建议设为16GB以内,否则仍可能触发系统OOM):
[wsl2]
memory=12GB
processors=4
swap=2GB
localhostForwarding=true
第四步:保存时,在记事本中必须点击“另存为”→在“编码”下拉菜单中手动选择UTF-8 无 BOM;若用VS Code,请在右下角点击编码名称(如UTF-8),选择“Save with Encoding”→“UTF-8”。
第五步:以管理员身份打开PowerShell,执行命令:wsl --shutdown——这一步不可跳过,否则新配置不会加载,vmmem仍按旧策略运行。
第六步:重新启动任意WSL发行版(如Ubuntu),打开终端后执行 free -h,观察Mem行总内存是否接近你设置的12GB值。若仍显示远高于该值,说明.wslconfig文件位置错误或编码不对。
用wsl --manage动态调整单个发行版内存(无需重启)
适用于已升级至WSL版本2.5+的用户,可对特定发行版单独限频,不影响其他发行版运行状态。
方法一:先查发行版名称和状态
在PowerShell中执行 wsl -l -v,确认目标发行版名称(如Ubuntu-24.04)及其STATE为Running或Stopped。
方法二:直接设置内存上限
执行命令:wsl --manage Ubuntu-24.04 --set-memory 8GB(将Ubuntu-24.04替换为你自己的发行版名)。
方法三:验证是否生效
启动该发行版后,在终端中运行 cat /proc/meminfo | grep MemTotal,输出数值应与设定值基本一致(允许±200MB误差)。若显示仍是默认的约16GB,则说明你的WSL版本低于2.5,需先执行 wsl --update 升级。
关闭WSL2后台驻留避免内存滞留
即使你没打开任何终端,vmmem也可能持续占着几GB——这是因为WSL2默认启用“启动即驻留”策略,只要有过一次启动,后台服务就长期存活。
执行 wsl --shutdown 可立即终止所有WSL2实例及关联的vmmem进程,释放全部内存。
若希望每次关闭终端后自动清理,可在Windows任务计划程序中创建触发器:当“Windows Terminal”或“PowerShell”进程退出时,运行 powershell -Command "wsl --shutdown"。
注意:不要依赖关闭终端窗口来结束WSL2,因为wslservice.exe和init进程会继续运行并维持内存占用,只有显式调用wsl --shutdown才能真正归还资源。











