JVM 作为一个通用的虚拟机,我们可以通过启动 Java 命令时指定不同的 JVM 参数,让 JVM 调整自己的运行状态和行为,内存管理和垃圾回收的 GC 算法,添加和处理调试和诊断信息等等。本节概括地讲讲 JVM 参数,对于 GC 相关的详细参数将在后续的 GC 章节说明和分析。
直接通过命令行启动 Java 程序的格式为:
java [options] classname [args]
java [options] -jar filename [args]
其中:
-
[options]
部分称为 "JVM 选项",对应 IDE 中的 VM options, 可用jps -v
查看。 -
[args]
部分是指 "传给main函数的参数", 对应 IDE 中的 Program arguments, 可用jps -m
查看。
如果是使用 Tomcat 之类自带 startup.sh 等启动脚本的程序,我们一般把相关参数都放到一个脚本定义的 JAVA_OPTS 环境变量中,最后脚本启动 JVM 时会把 JAVA_OPTS 变量里的所有参数都加到命令的合适位置。
如果是在 IDEA 之类的 IDE 里运行的话,则可以在“Run/Debug Configurations”里看到 VM 选项和程序参数两个可以输入参数的地方,直接输入即可。
上图输入了两个 VM 参数,都是环境变量,一个是指定文件编码使用 UTF-8,一个是设置了环境变量 a 的值为 1。
Java 和 JDK 内置的工具,指定参数时都是一个 -
,不管是长参数还是短参数。有时候,JVM 启动参数和 Java 程序启动参数,并没必要严格区分,大致知道都是一个概念即可。
JVM 的启动参数, 从形式上可以简单分为:
- 以
-
开头为标准参数,所有的 JVM 都要实现这些参数,并且向后兼容。 - 以
-X
开头为非标准参数, 基本都是传给 JVM 的,默认 JVM 实现这些参数的功能,但是并不保证所有 JVM 实现都满足,且不保证向后兼容。 - 以
-XX:
开头为非稳定参数, 专门用于控制 JVM 的行为,跟具体的 JVM 实现有关,随时可能会在下个版本取消。 -
-XX:+-Flags
形式,+-
是对布尔值进行开关。 -
-XX:key=value
形式, 指定某个选项的值。
实际上,直接在命令行输入 java,然后回车,就会看到 java 命令可以其使用的参数列表说明: