vmargs字段必须为字符串而非数组,例如"-xms512m -xmx2048m --enable-preview",空格分隔;若误写为数组或混淆args与vmargs,jvm将忽略参数,导致预览特性失效或内存配置不生效。

launch.json 里 vmArgs 字段必须是字符串,不是数组
很多人复制终端命令 java -Xms512m -Xmx2g -jar app.jar,直接把参数塞进 vmArgs 当成 JSON 数组写:"vmArgs": ["-Xms512m", "-Xmx2g"]——这会报错或静默失效。VSCode Java 调试器只接受 vmArgs 为单个字符串,空格分隔,和终端命令中 JVM 参数的写法一致。
-
vmArgs值必须是字符串,例如:"-Xms512m -Xmx2048m -XX:+UseG1GC" - 不能写成数组,也不能用逗号或换行分隔
- 参数顺序无关紧要,但
--enable-preview必须出现在vmArgs中,不能误放进args - 如果含空格(如路径类参数),用引号包裹整个值,而非单个参数:
"-Djava.library.path=\"/opt/mylib\""
vmArgs 和 args 完全不混用:一个给 JVM,一个给 main(String[] args)
这是最常踩的坑:args 传进去的是程序逻辑层的输入,vmArgs 才真正控制 JVM 行为。比如你加了 "args": ["--enable-preview"],程序启动时不会启用预览特性,反而可能在代码里收到一个叫 --enable-preview 的字符串参数,然后抛 UnsupportedOperationException。
-
vmArgs→ 影响 JVM:内存、GC、预览特性、系统属性等 -
args→ 影响你的main方法:对应String[] args的内容 - 两者字段并列,不能嵌套,不能合并;
vmArgs错放成args,JVM 就当没看见 - 典型错误示例:
"args": "-Xmx2g"或"vmArgs": ["--port", "8080"]
多配置共存时,vmArgs 只对当前 launch 配置生效
一个 launch.json 可能有多个 configurations,比如 “Debug Main”、“Run Tests”、“Launch with Profile”。每个配置的 vmArgs 是独立的,改错地方就白调了。
- 确认你编辑的是正在使用的那个
name对应的配置块 - 如果用右键“Debug As Java Application”自动生成配置,它可能新建一个配置,而不是修改已有项
- 检查
mainClass是否匹配——若类名写错,哪怕vmArgs写得再对,JVM 都没机会加载到你的代码 - Spring Boot 项目建议单独配一个带
-Dspring.profiles.active=dev的vmArgs,别和单元测试共用同一套
Java Language Server 的内存不在 launch.json 里调
你调大了 vmArgs,但代码补全还是卡,跳转慢,那很可能不是你运行的程序卡,而是后台的 jdt.ls(Java Language Server)内存不足。这个服务不受 launch.json 控制,它走的是 VSCode 全局设置。
- 在 VSCode 设置里搜
java.jdt.ls.vmargs,填入类似-Xms512m -Xmx2048m - 改完要重启 VSCode 才生效(不是重载窗口)
- 这个参数和
launch.json里的vmArgs没任何关系,别试图在launch.json里覆盖它 - 如果用了多个 Java 项目,
jdt.ls是共享进程,所以它的内存设置影响所有项目
Runtime.getRuntime().maxMemory(),而不是只看任务管理器里 java 进程的内存占用——后者包含 JVM 自身开销,且未必反映你设的 -Xmx 上限。Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











