Java 启动参数

启动方式

java命令启动Java程序,有两种方式:

  • 通过指定入口类:java SomeClass。这里的SomeClassmain()方法所在的类。其一般格式为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中的类加载路径。(如果-classpathCLASSPATH都没有设置,则JVM使用当前路径(.)作为类加载路径。)
JVM 搜索类的方式和顺序为:

  1. Bootstrap:Bootstrap中的路径是JVM自带的jar或zip文件,JVM首先搜索这些包文件,用System.getProperty("sun.boot.class.path")可得到其值。
  2. Extension:Extension是位于JRE_HOME/lib/ext目录下的jar文件,JVM在搜索完Bootstrap后就搜索该目录下的jar文件,用System.getProperty("java.ext.dirs")可得到其值。
  3. 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

参考文档:

  1. java: Launches a Java application - Oracle官方文档
  2. java启动参数一【博客园】
  3. java -jar 启动参数【CSDN】
  4. Java 设置系统参数和运行参数【CSDN】
  5. java程序启动参数-D详解【CSDN】
  6. JAVA启动参数三:非Stable参数
posted @ 2020-05-06 16:42  i江湖中人  阅读(5202)  评论(0编辑  收藏  举报