JVM 启动参数详解

JVM 启动参数详解

java命令用于启动JVM虚拟机。Java启动参数分为3种:

  1. 标准参数: 所有的JVM实现都必须实现这些参数的功能,而且向后兼容。JVM的标准参数都是以”-“开头。
  2. 非标准参数: 默认JVM(HotSpot虚拟机)实现这些参数的功能,但是并不保证所有jvm实现都满足,且不保证向后兼容.JVM的非标准参数都是以”-x“开头。
  3. 非stable参数:此类参数通常具有特定的系统要求,并且可能需要对系统配置参数的特权访问。各个jvm实现会有所不同,将来可能会随时取消,需要慎重使用。JVM的非stable参数都是以”-xx“开头。

JVM 标准参数

查看参数方式: java -help 或者是java -?。以下是JVM标准参数的详细介绍:

  1. -server: 选择使用 Java HotSpot Server VM3。特点是启动速度比较慢,但运行时性能和内存管理效率很高,适用于生产环境。在具有64位能力的jdk环境下将默认启用该模式,而忽略-client参数。
Architecture OS Default client VM if server-class, server VM;otherwise, client VM Default server VM
SPARC 32-bit Solaris X
i586 Solaris X
i586 Linux X
i586 Microsoft Windows X
SPARC 64-bit Solaris X
AMD64 Solaris X
AMD64 Linux X
AMD64 Microsoft Windows X

X = default VM
— = client VM not provided for this platform

  1. -client: 选择使用 Java HotSpot Client VM。设置jvm使用client模式,特点是启动速度比较快,但运行时性能和内存管理效率不高。在具有64位能力的jdk环境下将忽略-client参数。
  2. -agentlib:libname[=options]: 用于装载本机代理库;其中libname为本地代理库文件名,默认搜索路径为环境变量PATH中的路径,options为传给本地库启动时的参数,多个参数之间用逗号分隔。在Windows平台上jvm搜索本地库名为libname.dll的文件,在linux上jvm搜索本地库名为libname.so的文件,搜索路径环境变量在不同系统上有所不同,比如Solaries上就默认搜索LD_LIBRARY_PATH。
    • 比如:-agentlib:hprof ; 用来获取jvm的运行情况,包括CPU、内存、线程等的运行数据,并可输出到指定文件中。每隔 20 毫秒获取一次示例 CPU 信息,堆栈深度为 3:-agentlib:hprof=cpu=samples,interval=20,depth=3
    • 加载 Java 调试线路协议 (JDWP) 库并侦听端口 8000 上的套接字连接,从而在主类加载之前挂起 JVM:-agentlib:jdwp=transport=dt_socket,server=y,address=8000
    • 详细信息,请参阅以下内容:
      • java.lang.instrument软件包描述4
      • JVM Tools Interface guide 5
  3. -agentpath:pathname[=options]: 按全路径装载本地代理库,不再搜索PATH中的路径;其他功能和agentlib相同。
  4. -Dproperty=value: 设置系统属性名/值对,运行在此jvm之上的应用程序可用 System.getProperty("property")得到value的值。如果value中有空格,则需要用双引号将该值括起来-Dfoo="foo bar"
  5. -disableassertions[:[packagename]...|:classname] 或者 -da[:[packagename]...|:classname]: 禁用断言。默认所有包都禁用。当不带参数时,会关闭所有包和类的断言(注意系统class除外)。如果参数是包名带有...,那么会禁用指定包和所有子包的断言。如果参数只有...,那么会禁用当前工作目录下包的所有断言,如果参数是某个类型,那么会禁用当前类的断言。
  6. -disablesystemassertions-dsa: 禁用所有系统类(没有对应的classLoader)的断言。
  7. -enableassertions[:[packagename]...|:classname]-ea[:[packagename]...|:classname]: 开启断言。默认所有断言是关闭的。当不带参数时,会开启所有包和类的断言(注意系统class除外)。如果参数是包名带有...,那么会开启指定包和所有子包的断言。如果参数只有...,那么会开启当前工作目录下包的所有断言,如果参数是某个类型,那么会开启当前类的断言。
  8. -enablesystemassertions-esa: 开启所有系统类(没有对应的classLoader)的断言。
  9. -jar filename: 执行封装在 JAR 文件中的程序。filename参数是 JAR 文件的名称,jar里面manifest文件中的 Main-Class:classname属性定义了程序的入口类。使用该选项时,指定的 JAR 文件是所有用户类的源,其他类路径设置将被忽略。如果当前Jar包还有其他外部依赖。需要在manifest文件中添加Class-Path: baz.jar属性,来定义classpath。
  10. -javaagent:jarpath[=options]加载指定的 Java agent。参考 java.lang.instrument软件包描述4
  11. -classpath classpath或者-cp classpath告知jvm类搜索目录名、jar文档名、zip文档名,之间用分号;分隔;使用-classpath后jvm将不再使用CLASSPATH中的类搜索路径,如果-classpath和CLASSPATH都没有设置,则jvm使用当前路径(.)作为类搜索路径。jvm搜索类的方式和顺序为:Bootstrap,Extension,User。
    • Bootstrap中的路径是jvm自带的jar或zip文件,jvm首先搜索这些包文件,用System.getProperty(“sun.boot.class.path”)可得到搜索路径。
    • Extension是位于JRE_HOME/lib/ext目录下的jar文件,jvm在搜索完Bootstrap后就搜索该目录下的jar文件,用System.getProperty(“java.ext.dirs”)可得到搜索路径。
    • User搜索顺序为当前路径.、CLASSPATH、-classpath,jvm最后搜索这些目录,用System.getProperty(“java.class.path”)可得到搜索路径。
  12. -verbose:class: 打印类加载信息
  13. -verbose:gc: 打印GC信息
  14. -verbose:jni: 打印JNI本地方法调用信息。

JVM非标准参数

通过java -X可以输出非标准参数列表.非标准参数又称为扩展参数:

  • -Xint: 设置jvm以解释模式运行,所有的字节码将被直接执行,而不会编译成本地码。
  • -Xbatch:关闭后台代码编译,强制在前台编译,编译完成之后才能进行代码执行;默认情况下,jvm在后台进行编译,若没有编译完成,则前台运行代码时以解释模式运行。
  • -Xbootclasspath:bootclasspath: 让jvm从指定路径(可以是分号分隔的目录、jar、或者zip)中加载bootclass,用来替换jdk的rt.jar;若非必要,一般不会用到;
  • -Xbootclasspath/a:path: 将指定路径的所有文件追加到默认bootstrap路径中;
  • -Xbootclasspath/p:path:让jvm优先于bootstrap默认路径加载指定路径的所有文件;
  • -Xcheck:jni: 对JNI函数进行附加check;此时jvm将校验传递给JNI函数参数的合法性,在本地代码中遇到非法数据时,jmv将报一个致命错误而终止;使用该参数后将造成性能下降,请慎用。
  • -Xfuture: 让jvm对类文件执行严格的格式检查(默认jvm不进行严格格式检查),以符合类文件格式规范,推荐开发人员使用该参数。
  • -Xmixed: 混合模式执行(默认).用解释器执行所有字节码,但热方法除外,热方法被编译为本机代码。
  • -Xnoclassgc: 关闭针对class的gc功能;因为其阻止内存回收,所以可能会导致OutOfMemoryError错误,慎用;
  • -Xincgc: 开启增量gc(默认为关闭);这有助于减少长时间GC时应用程序出现的停顿;但由于可能和应用程序并发执行,所以会降低CPU对应用的处理能力。
  • -Xloggc:file: 与-verbose:gc功能类似,只是将每次GC事件的相关情况记录到一个文件中,文件的位置最好在本地,以避免网络的潜在问题。若与verbose命令同时出现在命令行中,则以-Xloggc为准。
  • -Xmn: 设置年轻代的初始和最大大小。建议将年轻代的规模保持在整体堆大小的一半到四分之一之间.
  • -Xms: 指定jvm堆的初始大小,默认为物理内存的1/64,最小为1M;可以指定单位,比如k、m,若不指定,则默认为字节。如果未设置此选项,则初始大小将设置为为老年代和年轻代分的大小之和。可以使用选项-Xmn-XX:NewSize设置年轻代的堆的初始大小。注意,-Xms-XX:InitalHeapSize选项还可用于设置初始堆大小。如果它出现在命令行之后,则初始堆大小将设置为用-Xms-XX:InitalHeapSize指定的值。
  • -Xmx: 指定jvm堆的最大值,默认为物理内存的1/4或者1G,最小为2M;单位与-Xms一致。对于服务器部署,-Xms和-Xmx通常设置为相同的值。该选项等效于-Xmx-XX:MaxHeapSize.
  • -Xss: 设置单个线程栈的大小,一般默认为512k。
  • -Xprof: 输出 cpu 配置文件数据,不要在生产系统中使用。
  • -Xcomp: 强制在第一次调用时编译方法。默认情况下,客户端VM执行 1,000 次解释型方法调用,服务器VM执行10000次解释型方法调用,虚拟机会即时编译方法。指定该选项将禁用解释方法调用,从而以牺牲效率为代价来提高编译性能。还可以在编译之前使用该选项-XX:CompileThreshold 修改解释方法调用的触发次数。
  • -Xrs: 减少jvm对操作系统信号(signals)的使用,该参数从1.3.1开始有效;从jdk1.3.0开始,jvm允许程序在关闭之前还可以执行一些代码(比如关闭数据库的连接池),即使jvm被突然终止;jvm关闭工具通过监控控制台的相关事件而满足以上的功能;更确切的说,通知在关闭工具执行之前,先注册控制台的控制handler,然后对CTRL_C_EVENT, CTRL_CLOSE_EVENT, CTRL_LOGOFF_EVENT, and CTRL_SHUTDOWN_EVENT这几类事件直接返回true。JVM 使用类似的机制来实现转储线程堆栈的功能以进行调试。CTRL_BREAK_EVENT 用于执行线程转储。但如果jvm以服务的形式在后台运行(比如servlet引擎),他能接收CTRL_LOGOFF_EVENT事件,但此时并不需要初始化关闭程序;为了避免类似冲突的再次出现,从jdk1.3.1开始提供-Xrs参数;当此参数被设置之后,jvm将不接收控制台的控制handler,也就是说他不监控和处理CTRL_C_EVENT, CTRL_CLOSE_EVENT, CTRL_LOGOFF_EVENT, or CTRL_SHUTDOWN_EVENT事件。指定-Xrs有两个后果:Ctrl + Break 线程转储不可用。用户代码负责唤起关闭hook,例如,在 JVM 终止时调用。System.exit().

JVM非Stable参数

设置参数的方法如下:

  • -XX:+<option> 启用选项
  • -XX:-<option>不启用选项
  • -XX:<option>=<number>
  • -XX:<option>=<string>

打印参数的几个参数设置:

参数 描述
-XX:+PrintFlagsInitial 该命令可以查看所有JVM参数启动的初始值
-XX:+PrintFlagsFinal 该参数会打印所有的系统参数的值
-XX:+PrintCommandLineFlags 该参数打印传递给虚拟机的显式和隐式参数。
-XX:+PrintVMOptions 该参数表示程序运行时,打印虚拟机接受到的命令行显式参数。

由于非State参数非常的多,因此这里就不列出所有参数进行讲解。只介绍我们比较常用的。

行为参数

参数 默认值 描述
-XX:+DisableExplicitGC 关闭 忽略System.gc()方法触发的垃圾收集
-XX:+MaxFDLimit 开启 最大化文件描述符的数量限制
-XX:+ScavengeBeforeFullGC 默认:开启 Full GC前触发一次Minor GC
-XX:+ExplicitGCInvokesConcurrent 关闭 当收到System.gc()提交的垃圾收集申请时,使用CMS收集器回收
-XX:+UseSerialGC Client模式默认开启,其他模式默认关闭 Jvm运行在Client模式下的默认值,打开此开关后,使用Serial + Serial Old的收集器组合进行内存回收
-XX:+UseParNewGC 默认关闭 打开此开关后,使用ParNew + Serial Old的收集器进行垃圾回收
-XX:+UseConcMarkSweepGC 默认关闭 使用ParNew + CMS + Serial Old的收集器组合进行内存回收,Serial Old作为CMS出现“Concurrent Mode Failure”失败后的后备收集器使用。
-XX:+UseParallelGC Server模式默认开启,其他模式关闭 Jvm运行在Server模式下的默认值,打开此开关后,使用Parallel Scavenge + Serial Old的收集器组合进行回收
-XX:+UseParallelOldGC 默认关闭 使用Parallel Scavenge + Parallel Old的收集器组合进行回收
-XX:SurvivorRatio 默认:8 新生代中Eden区域与Survivor区域的容量比值,默认为8,代表Eden:Subrvivor = 8:1
-XX:PretenureSizeThreshold 默认:无 直接晋升到老年代对象的大小,设置这个参数后,大于这个参数的对象将直接在老年代分配
-XX:MaxTenuringThreshold 默认:15 晋升到老年代的对象年龄,每次Minor GC之后,年龄就加1,当超过这个参数的值时进入老年代
-XX:UseAdaptiveSizePolicy 默认开启 动态调整java堆中各个区域的大小以及进入老年代的年龄
-XX:+HandlePromotionFailure JDK1.5及以前默认关闭,1.6默认开启 是否允许新生代收集担保,进行一次minor gc后, 另一块Survivor空间不足时,将直接会在老年代中保留
-XX:ParallelGCThreads 少于或等于8个cpu时,默认为cpu数量,多于8个时比cpu数量值小 设置并行GC进行内存回收的线程数
-XX:GCTimeRatio 默认:99 GC时间占总时间的比列,默认值为99,即允许1%的GC时间,仅在使用Parallel Scavenge 收集器时有效
-XX:MaxGCPauseMillis 默认:无 设置GC的最大停顿时间,在Parallel Scavenge 收集器下有效
-XX:CMSInitiatingOccupancyFraction 默认:68 设置CMS收集器在老年代空间被使用多少后出发垃圾收集,默认值为68%,仅在CMS收集器时有效
-XX:+UseCMSCompactAtFullCollection 默认:开启 由于CMS收集器会产生碎片,此参数设置在垃圾收集器后是否需要一次内存碎片整理过程,仅在CMS收集器时有效
-XX:+CMSFullGCBeforeCompaction 默认:无 设置CMS收集器在进行若干次垃圾收集后再进行一次内存碎片整理过程,通常与UseCMSCompactAtFullCollection参数一起使用

|-XX:+UseGCOverheadLimit|默认:开启|禁止GC过程无限制执行,如过于频繁,直接发生OutOfMemory异常|
|-XX:+UseTLAB|server模式默认开启|优先在本地线程缓冲区中分配对象,避免分配内存时的锁定过程|
|-XX:MaxHeapFreeRaito|默认:70|当Xmx比Xms值大时,堆可以动态收缩和扩展,这个参数控制当堆空闲大于指定值时自动收缩|
|-XX:MinHeapFreeRaito|默认:40|当Xmx比Xms值大时,堆可以动态收缩和扩展,这个参数控制当堆空闲小于指定值时自动扩展|
|-XX:MaxPermSize|默认 64M|设置永久代大小(JDK8)失效|
|-XX:+CMSParallelRemarkEnabled|默认关闭|降低标记停顿|
|-XX:MaxMetaspaceSize|无限制|元空间的最大本地内存|

即时编译

参数 默认值 描述
-XX:CompileThreshold client模式默认1500,server默认10000 触发方法即时编译的阈值
-XX:OnStackReplacePercentage Client默认值是933,server默认140 OSR比率,OSR即时编译阈值计算公式的参数之一
-XX:ReservedCodeCacheSize 默认32M 即时编译器编译代码的缓存最大值

多线程参数

参数 默认值 描述
-XX:+UseFastAccessorMethods 默认开启 频繁反射时,生成字节码来加速
-XX:UseSpinning 1.6默认开启,1.5默认关闭 开启自旋锁
-XX:PreBlockSpin 默认:10 自旋锁默认自旋次数
-XX:UseThreadPriorities 默认开启 使用本地线程优先级
-XX:UseBaisedLocking 默认开启 开启偏向锁

性能参数

参数 默认值 描述
-XX:AggressiveOpts 1.6默认开启,1.5关闭 使用激进的优化特性
-XX:UseLargePages 默认开启 大内存分页
-XX:StringCache 默认开启 字符串缓存
-XX:LargePageSizeInBytes 默认4M 内存页的大小不可设置过大,会影响Perm的大小,-XX:LargePageSizeInBytes=128m,需要OS支持
-XX:MaxHeapFreeRatio=70 100 GC后java堆中空闲量占的最大比例
-XX:MaxNewSize=size 新生成对象能占用内存的最大值
-XX:MinHeapFreeRatio=40 0 GC后java堆中空闲量占的最小比例
-XX:NewRatio=2 2 新生代内存容量与老生代内存容量的比例
-XX:NewSize=2.125m 新生代对象生成时占用内存的默认值
-XX:ThreadStackSize=512 设置线程栈大小,若为0则使用系统默认值,默认单位bytes

验证参数

参数 默认值 描述
-XX:+FailOverToOldVerifier 默认关闭,1.6引入 当新类型检查程序失败时,将转移到旧的验证程序。
-XX:-RelaxAccessControlCheck 默认开启 在验证程序中放松访问控制检查。

调试参数

参数 描述
-XX:+PrintGC 输出GC日志
-XX:+PrintGCDetails 输出GC的详细日志
-XX:+PrintGCTimeStamps 输出GC的时间戳(以基准时间的形式)
-XX:+PrintGCDateStamps 输出GC的时间戳(以日期的形式,如2013-05-04T21:53:59.234+0800)
-XX:+PrintHeapAtGC 在进行GC的前后打印出堆的信息
-XX:+PrintGCApplicationStoppedTime 输出GC造成应用暂停的时间
-XX:+PrintGCApplicationConcurrentTime 打印每次垃圾回收前,程序未中断的执行时间
-XX:+HeapDumpOnOutOfMemoryError 发生OOM的时候自动dump堆栈方便分析
-XX:+PrintTenuringDistribution 显示在survivor空间里面有效的对象的岁数情况,在每一个岁数上面,对象的存活的数量,以及其增减情况
-XX:OnOutOfMemoryError 发生内存溢出异常时,执行的命令
-XX:OnError 发生Error异常时,执行的命令
-XX:+TraceClassLoading 查看类加载信息
-XX:+TraceClassUnLoading 查看类卸载信息
-XX:-TraceLoaderConstraints 跟踪类加载器约束的相关信息
-XX:-TraceClassResolution 跟踪常量池
-XX:-TraceClassLoadingPreorder 跟踪被引用到的所有类的加载信息
-XX:-PrintCompilation 当一个方法被编译时打印相关信息
-XX:-PrintClassHistogram 遇到Ctrl-Break后打印类实例的柱状信息,与jmap -histo功能相同
-XX:-PrintConcurrentLocks 遇到Ctrl-Break后打印并发锁的相关信息,与jstack -l功能相同
-XX:-CITime 打印消耗在JIT编译的时间

java相关信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 显示系统配置
java -XshowSettings:system -version

# 显示JVM 设置。
java -XshowSettings:vm -version

# 显示与系统属性相关的设置。
java -XshowSettings:properties -version

# 显示区域设置
java -XshowSettings:locale -version

# 显示所有设置
java -XshowSettings:all -version

参考