必须将 --enable-preview 写入 launch.json 的 vmArgs 字符串字段(如 "vmArgs": "--enable-preview -source 21"),而非 args 或 settings.json 中的无效 vmargs 字段,同时确保 java.home 指向 JDK 20+。

vmArgs 是给 JVM 用的,不是给程序 args 用的
很多报 UnsupportedOperationException 或 Preview features are not enabled 的人,其实是把 --enable-preview 这类参数错写进了 args 字段。而 args 只会传给 main(String[] args),对 JVM 本身毫无影响。
真正控制 JVM 行为的参数必须走 vmArgs(注意是复数、带 s),且它只接受字符串类型,多个参数用空格分隔:
vmArgs: "--enable-preview"vmArgs: "-Xms512m -Xmx2048m --enable-preview"- 不能写成数组:
"vmArgs": ["--enable-preview"]—— 这会直接被忽略
launch.json 中的 vmArgs 和 settings.json 中的 java.jdt.ls.vmargs 完全不同
这两个字段名字像,但作用对象完全不同,混用必出问题:
-
launch.json里的vmArgs:控制你运行/调试的那个 Java 应用本身的 JVM 参数(比如 Spring Boot 启动、虚拟线程启用) -
settings.json里的java.jdt.ls.vmargs:只影响 Java 语言服务器(jdt.ls)自身启动时的 JVM 参数,用于提升补全、跳转等编辑体验,和你的代码运行无关 -
java.configuration.runtimes中的vmargs字段在当前 VSCode Java 扩展(2026 年主流版本)中不被识别,写了也白写
预览特性(如虚拟线程)必须同时满足三个条件
光加 --enable-preview 不够,缺一不可:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- JDK 版本 ≥ 20(推荐 21 LTS),且
java.home已正确指向该 JDK(路径不能含中文或空格) -
vmArgs中明确包含--enable-preview - 若用到新语法(如
Thread.ofVirtual()),还需加-source 21(或对应版本),否则编译器可能拒绝解析
示例完整配置:
{
"type": "java",
"name": "Debug Virtual Thread",
"request": "launch",
"mainClass": "App",
"vmArgs": "--enable-preview -source 21"
}
别忘了检查 java.home 和终端环境一致性
VSCode Java 扩展是否真用了你想要的 JDK,不能只看 java -version 输出。要确认三处统一:
-
java.home设置(用户级或工作区级) -
Maven › Terminal: Use Java Home是否勾选(确保终端里mvn也走同一 JDK) - 如果项目用 Gradle/Maven 构建,还要单独检查
java.configuration.runtimes是否声明了匹配的 runtime name(如"name": "JavaSE-21")
最常被忽略的是:改完 java.home 后没重启 VSCode,导致语言服务器仍跑在旧 JDK 上,补全和诊断都错位。


















