要让代码编译器真正常驻物理内存不被回收,需修改注册表禁用分页执行和启用大系统缓存、设置高DPI缩放与管理员权限运行、关闭内存压缩及SysMain服务,必要时用RAMMap锁定工作集。

Windows 11 默认会对长时间未交互的桌面程序(包括 VS Code、PyCharm、Visual Studio 等编译器)触发内存压缩或后台挂起机制,尤其在低内存压力下仍可能被系统回收 Standby 内存页,导致切换回编辑器时卡顿、插件重载、调试会话中断。要让指定代码编译器真正常驻物理内存不被回收,需绕过 Windows 的内存管理策略,而非仅靠“最小化”或“保持窗口焦点”。
阻止编译器进程被内存回收的核心操作
这一步直接干预 Windows 内存管理行为,确保编译器主进程及其子进程(如 Electron 渲染器、Java 后台服务、Python LSP 服务器)始终保留在 Active/Standby 内存池中,不被系统自动释放。
按下 Win + R → 输入 regedit → 回车,以管理员权限打开注册表编辑器 → 导航至:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management
在右侧空白处右键 → 新建 → DWORD (32位) 值 → 命名为 DisablePagingExecutive → 双击该值,将数值数据设为 1 → 点击确定。
继续在同一路径下,右键新建另一个 DWORD (32位) 值,命名为 LargeSystemCache → 双击设数值数据为 1。
【必须重启生效】 这两个注册表项共同作用:前者强制内核和驱动代码常驻物理内存,后者扩大系统缓存区并优先保留用户进程内存页;若不重启,修改完全无效。
为编译器进程单独启用“高内存优先级”
仅靠系统级设置不够稳定,还需对编译器主进程施加运行时保护。此方法适用于所有基于 Electron(VS Code)、JVM(IntelliJ)、.NET(Visual Studio)或原生 Win32(Code::Blocks)的编译器。
第一步:找到编译器的主执行文件路径(例如 VS Code 是 C:\Users\XXX\AppData\Local\Programs\Microsoft VS Code\Code.exe,PyCharm 是 ...\bin\pycharm64.exe)。
第二步:右键该 .exe 文件 → 属性 → 兼容性 → 点击“更改高 DPI 设置” → 勾选“替代高 DPI 缩放行为”,缩放执行选择“应用程序” → 确定。
第三步:仍在此属性窗口 → 切换到“快捷方式”选项卡 → 点击“高级” → 勾选“以管理员身份运行此程序” → 确定 → 应用。
这三步组合效果是:绕过 DPI 虚拟化内存隔离、禁用 UI 线程节流、并让进程以高完整性级别启动,从而进入 Windows 内存管理的“豁免白名单”区域。
禁用系统级内存压缩与 Standby 页面回收
Windows 11 默认启用 Memory Compression 和 SuperFetch(SysMain),它们会把闲置进程内存页压缩或移入 Standby List,看似节省内存,实则让编译器在切出后迅速失去响应能力。
方法一:关闭内存压缩
以管理员身份运行 PowerShell → 执行命令:Disable-MMAgent -mc
方法二:彻底停用 SysMain 服务(比禁用更有效)
仍在同一 PowerShell 窗口中执行:Stop-Service SysMain -Force; Set-Service SysMain -StartupType Disabled
【注意】 此操作不会影响文件索引或搜索功能,但会显著降低后台内存页被挪用的概率,尤其对多开项目、大仓库 Git 操作的编译器极为关键。
为编译器添加自定义工作集锁定(可选增强)
适用于已知内存占用稳定的编译器(如 Visual Studio 或 Rider),通过 API 强制锁定其工作集大小,防止系统将其内存页置换出去。
第一步:下载微软官方工具 RAMMap(Sysinternals 套件,免费可信)→ 解压后以管理员身份运行 RAMMap.exe。
第二步:点击菜单栏 “Processes” → 在进程列表中找到你的编译器进程(如 devenv.exe 或 jetbrains-rider64.exe)→ 右键 → 选择 “Set Working Set…”。
第三步:勾选 “Lock working set in physical memory” → 在下方输入建议值(单位 KB):
VS/Resharper 类:填 1048576(即 1GB)
VS Code/PyCharm 类:填 524288(即 512MB)→ 点击 OK。
该设置仅对当前会话有效,但每次启动编译器后执行一次即可,无需脚本自动化。

















