要搞懂 Linux 里那个 JDK 版本到底几号,实际上不用绕啥弯弯绕,直接让 JVM 自己喊话要么在命令行里敲几行命令,效果立竿见影。 别管会不会报错,只要运行 `java -version` 要么 `JAVA_HOME` 环境变量对应的 `jcmd` 命令,终端就会吐出最新的要么默认的 JDK 信息。有些老程序费劲去调 `info -version` 就连 `vminfo` 命令,结局发现这些命令根本不知道当前环境的 JDK 在哪,直接回空数据要么乱码,这时候跑起来就尴尬了。 实际上最稳最快的方式还是 `java -version`。

这个命令在 JDK 1.4 就存有了,别看老版本有点臃肿,但依然是标配。在 Linux 终端输入 `java -version` 之后,屏幕上会直接渲染出一行信息,中间夹着诸如 `JRE 1.8.0_171` 要么 `JDK 11.0.11` 这种版本号。

这时候你不需求去猜,也不用去查 `JAVA_HOME` 环境变量,只要运行这个命令,就能直接拿到最权威的答案。 不过,有时候命令执行了,信息却显示 `No Version Information is Available`,这时候难题可能出在 JDK 还没被对识别。

这时候能够把鼠标框住那条报错行,按 `Shift + Enter` 执行,看能不能跑通;要么直接用 `java -version` 替代它,有时候系统会自动调整设置,这个命令一般比 `info` 更稳妥。 要是还是不中,那就不得不依赖 `jcmd` 了。对于 JDK 11 及高版本,`jcmd` 是个神器,它既能显示版本又能抓取堆栈。在终端输入 `jcmd ` 其中 `` 是你的进程 ID,比如点亮你的 JDK 进程(Ctrl+Alt+T)后看一眼终端,输入 `jcmd 12345`,要是反馈是 `JDK 11.0.11`,那说明一切正常,版本就锁死了。 有时候为了确认 JDK 版本,还得看看 `jcmd` 的具体输出。

比如输入 `jcmd 12345 -verbose`,要是看到 `JVM 1.8.0_211 -JJavaHome=/usr/lib/jdk/11` 这种输出,那就绝对稳定,版本信息藏在后面。

有时候还会看到 `JVM 11.0.11 -JJavaHome=/usr/lib/jdk/11`,这种格式更清楚。 有些脚本要么开发者习惯用 `vminfo` 命令,但在 Linux 上它时常不可用,就连需求 `jinfo` 配合 `jcmd` 一起用。在 `java -version` 跑不通要么格式乱七八糟的时候,`vminfo` 命令往往是个救星。输入 `vminfo` 要么 `jinfo -info`,它能回更详细的 JVM 参数,包含是否开启了 ZGC、是否用了 G1GC 这些高级特性,顺便也带上版本信息。 还有一种场景是运行 `jinfo` 命令,别看它只能显示旧版本的信息,但配合 `jcmd` 就能模拟出类似 Java 11 的输出格式,比如 `JVM 11.0.11 -JJavaHome=/usr/lib/jdk/11`。

这时候你不用管 JDK 是 8 还是 17,只要看到 `JVM` 后面跟着一串数字,那就是当前的版本。 要是你想知道 Java 到底安装在哪,能够顺便查一下 `JAVA_HOME`。

这个环境变量默认指向 `/usr/lib/jdk/1.8`,但要是你的 JDK 路径改了,比如是 `/opt/openjdk/17`,那这个变量就得改成对应路径。输入 `echo $JAVA_HOME` 要么直接运行 `echo $JAVA_HOME`,要是输出的是 `/usr/lib/jdk/1.8`,说明路径没难题;要是输出是空的,那可能 JDK 还没加载要么环境变量没配好,这时候再跑 `java -version` 看看是不是能响应出来。 实际上有些开发者喜爱运行 `jinfo -info -verbose` 这种超长命令,别看看起来傻,但能获取到贼详细的配置信息,比如 GC 算法、堆内存大小、线程池配置什么的。在 Linux 终端直接输入 `jinfo` 要么 `info -version` 也能拿到基础信息,别看不如前者详细,但优先级挺高。 最终,要是想彻底摸清底细,能够试试 `set -x` 要么 `set -i` 这种调试模式。输入 `set -x` 后,程序会打印出所有的系统调用和 Java 内部调用,这时候 `java -version` 的命令执行路径会暴露出来,就连能看看到底用了哪个 JVM 加载器。输入 `set -i` 则会让环境变量 `-Xss` 和 `-XX` 等参数生效,有时候能触发一些版本相关的日志。 总而言之,查 JDK 版本这事儿,最直接的武器就是 `java -version`,好办粗暴,成功率极高。

要是它挂,就用 `jcmd` 要么 `vminfo` 兜底,再配合 `jinfo` 看看能不能补充更多细节。

只要你把这几个命令都练熟,看着命令行输出那几行字,心里就比哪位都清楚当前环境的 JDK 版本到底是几号。