通过.wslconfig配置内存上限、wsl--manage动态调优、wsl.conf启用自动回收、压缩vhdx磁盘及禁用localhostforwarding,可有效解决wsl2的vmmem内存占用过高问题。

如果您在 Windows 11 中运行 WSL2,发现系统内存被 vmmem 进程持续大量占用,甚至导致主机响应迟缓,则很可能是 WSL2 虚拟机未受资源约束、无限制地动态分配内存。以下是解决此问题的步骤:
一、通过 .wslconfig 文件静态配置内存上限
该方法为最通用且稳定的方式,适用于所有 WSL2 发行版。它通过在用户主目录下创建全局配置文件,强制 WSL2 启动时加载预设的内存、CPU 和交换空间限制,防止其过度抢占宿主机资源。
1、按下 Win + R 打开“运行”窗口,输入 %UserProfile% 并回车,进入当前 Windows 用户主目录。
2、在该目录下新建一个纯文本文件,命名为 .wslconfig(注意开头为英文点号;若系统隐藏扩展名,请确保实际文件名不含 .txt)。
3、用记事本或 VS Code 打开该文件,在其中写入以下内容(请根据您物理内存总量合理设定数值,例如 16GB 主机建议 memory ≤ 10GB):
[wsl2]
memory=6GB
processors=4
swap=2GB
localhostForwarding=true
4、保存文件时,务必选择 UTF-8 无 BOM 编码格式(在记事本中需通过“另存为”手动指定编码)。
5、以管理员身份打开 PowerShell,执行命令:wsl --shutdown,彻底终止所有正在运行的 WSL2 实例。
6、重新启动任意 WSL 发行版(如 Ubuntu),新配置即刻生效。
二、使用 wsl --manage 命令动态调整单个发行版内存
该方法无需重启 WSL 发行版,适用于已升级至 WSL 版本 2.5 或更高版本的用户。它允许对指定发行版实时修改内存上限,不影响其他已安装的 WSL 发行版运行状态。
1、在 PowerShell 中执行 wsl -l -v,确认目标发行版名称(如 Ubuntu-22.04)及其状态。
2、运行 wsl --version,检查输出中 Version 字段值是否 ≥ 2.5。
3、执行动态设置命令:wsl --manage Ubuntu-22.04 --memory 5GB(将 Ubuntu-22.04 替换为您的实际发行版名称)。
4、该命令立即应用,无需关闭终端或重启发行版,但仅对该发行版生效。
三、启用 WSL 内存自动回收机制(基于 wsl.conf)
WSL2 支持在 Linux 子系统内部启用内存压力感知与自动释放策略,配合 .wslconfig 使用可进一步抑制 vmmem 长期高位驻留。该机制依赖于 /etc/wsl.conf 中的 swap 和 systemd 配置协同工作。
1、在 WSL 终端中执行 sudo nano /etc/wsl.conf(若无 nano 可改用 vim 或 sudoedit)。
2、添加以下内容并保存:
[boot]
systemd=true
[wsl2]
swap=1GB
3、退出 WSL 终端后,在 PowerShell 中再次执行 wsl --shutdown。
4、重启 WSL 发行版,systemd 启动后将接管内存管理,配合 swap 设置触发内核级内存回收逻辑。
四、压缩 WSL2 虚拟硬盘以降低内存映射开销
WSL2 底层使用 VHDX 虚拟磁盘,当该磁盘长期扩容后未收缩,会导致 vmmem 在加载时映射过大内存区域。压缩虚拟硬盘可显著减少初始内存占用及后续映射压力。
1、在 PowerShell 中执行 wsl --shutdown,确保所有 WSL 实例已终止。
2、运行 diskpart 启动磁盘管理工具。
3、依次输入以下命令(路径需替换为您的实际 WSL 发行版 VHDX 位置,常见路径如 C:\Users\{用户名}\AppData\Local\Packages\...\LocalState\ext4.vhdx):
select vdisk file="C:\Users\YourName\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu22.04LTS_79rhkp1fndgsc\LocalState\ext4.vhdx"
attach vdisk readonly
compact vdisk
detach vdisk
exit
五、禁用 WSL2 的 localhost 自动转发以降低后台驻留强度
WSL2 默认启用 localhostForwarding,该功能需常驻代理进程监听 Windows 端口,间接增加 vmmem 的线程与内存负载。若不使用跨系统端口访问(如从 Windows 浏览器访问 WSL 中的 Web 服务),可安全关闭此项。
1、编辑用户目录下的 .wslconfig 文件。
2、将原配置中的 localhostForwarding=true 修改为 localhostForwarding=false。
3、保存文件后,在 PowerShell 中执行 wsl --shutdown。
4、重启 WSL 发行版,相关代理进程将不再启动。











