Java 启动参数
启动方式
用java
命令启动Java程序,有两种方式:
- 通过指定入口类:
java SomeClass
。这里的SomeClass
是main()
方法所在的类。其一般格式为java [ options ] SomeClass[ arguments ]
。 - 指定入口类所在jar包:
java -jar SomeJar.jar
。这里的SomeJar.jar
是入口类所在的jar包。其一般格式为java [ options ] -jar SomeJar.jar [ arguments ]
。
在一般格式中:
- [ options ]:配置 Java 的虚拟机选项(或称 系统参数)
- [ arguments ]:配置 Java 程序参数(或称 运行参数)
例如:java -Dfile.encoding=UTF-8 -Dusername=Joe Test hi a b c d
启动参数的类型
在启动Java程序时,可以指定两类参数,分别叫做虚拟机选项(VM options)和程序参数(program arguments)。
虚拟机选项是指由JVM支持、用于设置虚拟机启动过程的参数。
程序参数是指用户自定义的参数,在代码中可以通过main()方法的String[] args
获取。
虚拟机选项(VM options)
虚拟机选项分为3类,分别是:
- 标准参数(-):所有的JVM实现都必须实现这些参数的功能,而且向后兼容。
- 非标准参数(-X):默认JVM实现这些参数的功能,但是并不保证所有JVM实现都满足,且不保证向后兼容。
- 非Stable参数(-XX):此类参数各个JVM实现会有所不同,将来可能会随时取消,需要慎重使用。
标准参数
标准参数是指以-
开头的参数。常见的标准参数如:
- -client / -server: 指定虚拟机以client模式(Windows下的默认模式)还是server模式(Linux下的默认模式)启动。
- -jar:指定以jar包的形式执行一个应用程序。要这样执行一个应用程序,必须让jar包的
manifest
文件中声明初始加载的Main-class
,该类中必须有public static void main(String[] args)
方法。 - -verbose 或 -verbose:class:输出JVM载入类的相关信息,当JVM报告说找不到类或者类冲突时可此进行诊断。
- -verbose:gc:输出每次GC的相关情况。
- -verbose:jni:输出native方法调用的相关情况,一般用于诊断jni调用错误信息。
- -X:输出非标准的参数列表及其描述。
- -? 或 -help:输出java标准参数列表及其描述。
- -version:输出java的版本信息,比如jdk版本、vendor、model。
- -javaagent:jarpath[=options]:指定jvm启动时装入java语言设备代理。Jarpath文件中的
mainfest
文件必须有Agent-Class
属性,代理类必须实现方法public static void premain(String agentArgs, Instrumentation inst)
(和main方法类似)。当JVM初始化时,将按代理类的说明顺序调用premain方法。具体参见java.lang.instrument
软件包的描述。 - -enableassertions[:"..." | : ] 或 -ea[:"..." | : ]:用来设置JVM是否启动断言机制(从JDK 1.4开始支持),缺省时JVM关闭断言机制。
- -disableassertions[:"..." | :<class ; ] 或 -da[:"..." | : ]:用来设置JVM关闭断言处理,一般用于相同package内某些class不需要断言的场景。
- -enablesystemassertions 或 -esa:激活系统类的断言。
- -disablesystemassertions 或 -dsa:关闭系统类的断言。
类加载路径
JVM的类加载路径通过-classpath <classpath>
或-cp <classpath>
指定,多个路径之间用分号分隔,如:
-classpath "D:\Program Files\Java\jdk1.8.0_231\jre\lib\charsets.jar;D:\Program Files\Java\jdk1.8.0_231\jre\lib\deploy.jar"
使用-classpath
后,JVM 将不再使用CLASSPATH
中的类加载路径。(如果-classpath
和CLASSPATH
都没有设置,则JVM使用当前路径(.)作为类加载路径。)
JVM 搜索类的方式和顺序为:
- Bootstrap:Bootstrap中的路径是JVM自带的jar或zip文件,JVM首先搜索这些包文件,用
System.getProperty("sun.boot.class.path")
可得到其值。 - Extension:Extension是位于
JRE_HOME/lib/ext
目录下的jar文件,JVM在搜索完Bootstrap后就搜索该目录下的jar文件,用System.getProperty("java.ext.dirs")
可得到其值。 - User:User搜索顺序为当前路径、
CLASSPATH
、-classpath
。用System.getProperty("java.class.path")
可得到其值。
在标准参数中,有一类以-D
开头定义的参数,叫做系统属性参数,用于在虚拟机的系统属性中设置属性名/值对。
系统属性参数
系统属性参数以-D<propertyName>=value
形式定义,运行在此虚拟机之上的应用程序可用System.getProperty("propertyName")
得到value的值。
多个系统属性参数之间用空格隔开。如果value中有空格,则需要用双引号将该值括起来,如-Dname=”space string”。
参数可以是 Java 默认的,此类参数由 JVM 虚拟机自动识别并生效,例如-Dfile.encoding=UTF-8
用于指定文件编码格式;
也可以是用户自定义的,例如-Dusername=Joe
,程序中可以读取该参数值,执行相关逻辑。
如-Dspring.profiles.active=dev
可以在SpringBoot启动中指定系统变量,用于多环境(开发、测试、预发、线上)的区分。
关于标准参数更详细的说明可以参看这篇文章。
非标准参数
非标准参数又称为扩展参数,是指以-X
开头的参数,可以通过java -X
打印出所有的非标准参数。
常见的非标准参数如:
- -Xms:指定JVM堆的初始大小(memory of start?),如
-Xms3550m
。 - -Xmx:指定JVM堆的最大值(memory of maximum?),如
-Xmx3550m
。 - -Xmn:指定JVM堆中新生代的大小(memory of nursery),如
-Xmn2g
。 - -Xss:设置单个线程栈的大小(stack size),一般默认为512k。等同于
-XX:NewSize
。 - -Xprof:跟踪正运行的程序,并将跟踪数据在标准输出输出;适合于开发环境调试。
- -Xloggc:
:与-verbose:gc功能类似,只是将每次GC事件的相关情况记录到一个文件中。若与verbose命令同时出现在命令行中,则以-Xloggc为准。 - -Xint:设置JVM以解释模式运行,所有的字节码将被直接执行,而不会编译成本地码。
更详细的说明可以参看这篇文章。
非Stable参数
非Stable参数是指以-XX
开头的参数。
这类参数在JVM中可能是不健壮的,SUN也不推荐使用,后续可能会在没有通知的情况下就直接取消了。
但这些参数中有些的确很有用,比如我们经常会见到的-XX:PermSize
、-XX:MaxPermSize
。
这些参数可以大致分成三类:
- 行为参数(Behavioral Options):用于改变jvm的一些基础行为
- 性能调优(Performance Tuning):用于jvm的性能调优
- 调试参数(Debugging Options):一般用于打开跟踪、打印、输出等jvm参数,用于显示jvm更加详细的信息
更详细的说明可以参看这篇文章。
程序参数(program arguments)
用户自定义的参数。在代码中通过main()方法的String[] args
获取后,用户在代码中按约定的格式对其进行解析,得到所需的参数值。
最终,我们来看一个包含各类参数的java
启动命令:
java -jar -server -Xmx3550m -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintGCDetails -XX:+PrintGCDateStamps
-Dserver.connection-timeout=60000 -Dspring.profiles.active=online SomeJar.jar argument1 argument2
参考文档: