当你在编写源代码时,你是在编写人类可以阅读的代码。在将代码编译成机器语言之前,计算机无法执行它。机器语言是一个通用术语,指的是特定机器所需的任意数量的语言。通常,如果你在 Linux 上编译代码,它只能 Linux 上运行;如果你在 Windows 上编译代码,它就只在 Windows 上运行。但是,Java 是不同的,它并不以真实的机器为目标,而是面向 Java 虚拟机Java Virtual Machine(JVM)。因此,它可以在任何机器上运行。
你可以使用 alternatives命令,来查看 Linux 系统上的 JDK 列表:
$ alternatives --config javaThere are 2 programs that provide java.Selection Command-----------------------------------------------*+ 1 java-11-openjdk.x86_64 (/usr/lib/jvm/java-11-openjdk-11.0.13.0.8-2.fc35.x86_64/bin/java)2 java-1.8.0-openjdk.x86_64 (/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.312.b07-2.fc35.x86_64/jre/bin/java)Enter to keep the current selection[+], or type selection number:
如果想要在可用的 JDK 之间进行切换,请再次执行该命令:
$ sudo alternatives --config java
或者可以使用 SDKMan,它可以下载、更新和管理系统中的所有 JDK。
要获取详细的 JVM 版本信息,请使用如下命令:
$ java -Xinternalversion --versionOpenJDK 64-Bit Server VM (11.0.13+8) for linux-amd64 JRE (11.0.13+8), built on Nov 8 2021 00:00:00 by "mockbuild" with gcc 11.2.1 20210728 (Red Hat 11.2.1-1)
要获取这些属性设置,请使用:
$ java -XshowSettings:properties --version
高级选项
这些参数不是随意使用的,而是用于调整 Hotspot VM 的特定区域。这些参数可能会发生变化,并且不能保证得到所有 JVM 实现的支持。
这些参数以 -XX开头。如需列出参数列表,使用如下命令:
$ java -XX:+UnlockDiagnosticVMOptions -XX:+PrintFlagsFinal -version
例如,需要跟踪类的加载,那么使用下面的命令:
$ java -XX:+TraceClassLoading Hello
在 Hello.java中:
public class Hello { public static void main(String[] args) { System.out.println("Inside Hello World!"); }}
另一个可能会面临的问题是 OOM(内存超出Out Of Memory)错误,它发生的时候可能没有太多的调试信息。为了解决这个问题,使用调试参数 -XX:+HeapDumpOnOutOfMemoryError,它可以创建一个带有调试信息的.hprof文件。
// TestClass.javaimport java.util.ArrayList;import java.util.List;public class TestClass { public static void main(String[] args) { List$ Javac TestClass.java$ java -XX:+HeapDumpOnOutOfMemoryError -Xms10m -Xmx1g TestClassjava.lang.OutOfMemoryError: java heap spaceDumping heap to java_pid444496.hprof ...Heap dump file created [1018925828 bytes in 1.442 secs]Exception in thread "main" java.lang.OutOfMemoryError: java heap spaceat TestClass.main(TestClass.Java:8)
有一些工具可以查看这个.hprof文件以了解问题所在。