当你在编写源代码时,你是在编写人类可以阅读的代码。在将代码编译成机器语言之前,计算机无法执行它。机器语言是一个通用术语,指的是特定机器所需的任意数量的语言。通常,如果你在 Linux 上编译代码,它只能 Linux 上运行;如果你在 Windows 上编译代码,它就只在 Windows 上运行。但是,Java 是不同的,它并不以真实的机器为目标,而是面向 Java 虚拟机 (JVM)。因此,它可以在任何机器上运行。
$ java Usage: java [options] <mainclass> [args...] (toexecutea class) or java [options] -jar <jarfile> [args...] (toexecutea jar file)
where options include:
-cp <class search path of directories and zip/jar files> -classpath <class search path of directories and zip/jar files> --class-path <class search path of directories and zip/jar files> A : separated list of directories, JAR archives, and ZIP archives tosearchfor class files. --enable-preview allow classes to depend on preview features of this release
To specify anargumentfora long option, you can use --<name>=<value>or --<name><value>.
这些是所有 JVM 都会包含的标准参数,你可以像使用任何 命令行选项 一样安全地使用它们。例如,要验证配置的命令选项,创建 VM 并加载主类而不执行主类,请使用:
1 2
$ java --dry-run <classfile>
非标准参数
非标准选项以 -X 开头。这些是通用的,并且特定于 JVM 的特定实现。要列出这些参数,请输入:
1 2 3 4 5 6 7 8 9 10
$ java -X -Xbatch disable background compilation -Xbootclasspath/a:<directories and zip/jar files separated by :> append toendof bootstrap class path -Xinternalversion displays more detailed JVM version information than the -version option -Xloggc:<file> log GC status to a filewithtime stamps [...]
在这些参数可能会不经通知就发生变化。而且,并非所有 JVM 实现都支持这些参数。
微软构建的 JVM 可能与 RedHat 构建的 JVM 有不同的参数,诸如此类。
要获取详细的 JVM 版本信息,请使用如下命令:
1 2 3
$ java -Xinternalversion --version OpenJDK 64-BitServer VM (11.0.13+8) for linux-amd64 JRE (11.0.13+8), built on Nov 8202100:00:00by "mockbuild" with gcc 11.2.120210728 (Red Hat 11.2.1-1)
要获取这些属性设置,请使用:
1 2
$ java -XshowSettings:properties --version
高级选项
这些参数不是随意使用的,而是用于调整 Hotspot VM 的特定区域。这些参数可能会发生变化,并且不能保证得到所有 JVM 实现的支持。
publicclassTestClass { publicstaticvoidmain(String[] args) { List<Object> list = newArrayList<Object>(); for (inti=0; i < 1000; i++) { list.add(newchar[1000000]); } } }
1 2 3 4 5 6 7 8
$ Javac TestClass.java $ java -XX:+HeapDumpOnOutOfMemoryError -Xms10m -Xmx1g TestClass java.lang.OutOfMemoryError: java heap space Dumping heap to java_pid444496.hprof ... Heap dump file created [1018925828bytes in 1.442 secs] Exception in thread "main"java.lang.OutOfMemoryError: java heap space at TestClass.main(TestClass.Java:8)