摘要: 我们知道 java 虚拟机启动时会带有很多的启动参数,Java 命令本身就是一个多参数的启动命令.那么具体 JVM 启动包含哪些参数呢?这篇文章针对 java8 的情况做一篇汇总解读,包含大多数常见和不常见的命令参数,过于小众的就不写了.
我们知道 java 虚拟机启动时会带有很多的启动参数,Java 命令本身就是一个多参数的启动命令.那么具体 JVM 启动包含哪些参数呢?这篇文章针对 java8 的情况做一篇汇总解读,包含大多数常见和不常见的命令参数,过于小众的就不写了.
命令参数包含
标准参数(Standard Option)
非标准参数(Non-Standard Options)
高级运行时参数(Advanced Runtime Options)
高级 JIT 编译器参数(Advanced JIT Compiler Options)
高级服务能力参数(Advanced Serviceability Options)
高级垃圾回收参数(Advanced Garbage Collection Options)
java 命令本身是通过下面的形式启动 java 应用的.这是 java 的基础,很多用惯了 IDE 的同学可能都不知道启动命令了.
这篇文章想总结的就是 options 这块的内容.
具体解读
标准参数(Standard Option)
标准参数是被所有 JVM 实现都要支持的参数.用于做一些常规的通用的动作,比如检查版本,设置 classpath 等.
-agentlib:libname[=options]
这个命令加载指定的 native agent 库.理论上这条 option 出现后,JVM 会到本地固定路径下 LD_LIBRARY_PATH 这里加载名字为 libxxx.so 的库.而这样的库理论上是 JVM TI 的功能,具体可以参考 JVM TI 规范
-agentpath:pathname[=options]
这个参数指定了从哪个绝对路径加载 agent 库.与 - agentlib 相同,只不过是用绝对路径来指明库文件.
-client
-server
指定 JVM 的启动模式是 client 模式还是 server 模式,具体就是 Java HotSpot Client(Server) VM 版本.目前 64 位的 JDK 启动,一定是 server 模式,会忽略这个参数.
-Dproperty=value
这个参数是最常见的了,就是设置系统属性,设置后的属性可以在代码中 System.getProperty 方法获取到.
-d32 和 -d64
这个参数指定 JVM 启动的环境模式,默认是 32 位启动,如果系统不支持,那么会报错,-d64 模式和 - server 模式是绑定的,也就是说 - d64 声明了就默认是 server 模式.
disableassertions[:[packagename]...|:classname]
-da[:[packagename]...|:classname]
关闭指定包或类下的 assertion,默认是关闭的.
-disablesystemassertions
-dsa
关闭系统包类下的 assertion.
-enableassertions[:[packagename]...|:classname]
-ea[:[packagename]...|:classname]
同上,开启指定包类下的 assertion.
-enablesystemassertions
-esa
同上,开启系统包类下的 assertion.
-javaagent:jarpath[=options]
加载指定的 java agent,具体需要传入 jar 路径.
-verbose:class
-verbose:gc
-verbose:jni
这些组合都是用来展示信息的,class 展示的每个 class 的信息,gc 展示每个 GC 事件的信息,jni 开启展示 JNI 调用信息.
-version
显示版本信息,然后退出
非标准参数(Non-Standard Options)
这里的非标准参数主要是针对官方 JVM 也就是 HotSpot 的,当然各家自研的 JVM 也有自己的非标准参数.
-X
著名的 - X 参数,就是一个 help,展示所有 - X 开头的参数说明.
-Xbatch
禁止后台编译.将编译过程放到前台任务执行.JVM 默认会将编译任务当做后台任务执行.这个参数等价于 - XX:-BackgroundCompilation
-Xfuture
强制 class 文件格式检查.
-Xint
在 interpreted-only 模式运行程序.编译为 native 的模式不再生效,所有的字节码都在解释器环境下解释执行.
-Xinternalversion
打印一个更详细的 java 版本信息,执行后退出.
-Xloggc:filename
设置 gc 日志文件,gc 相关信息会重定向到该文件.这个配置如果和 - verbose:gc 同时出现,会覆盖 - verbose:gc 参数.
比如 - Xloggc:/home/admin/logs/gc.log
-Xmaxjitcodesize=size
为 JIT 编译的代码设置最大的 code cache.默认的设置是 240m,如果关闭了 tiered compilation,那么默认大小是 48m.这个参数和 - XX:ReservedCodeCacheSize 是等价的.
-Xmixed
用解释器执行所有的字节码,除了被编译为 native code 的 hot method.
-Xmnsize
设置初始最大的年轻代堆大小.
比如 - Xmn256m
-Xmssize
设置初始的堆大小.
-Xmxsize
设置最大的内存分配大小.一般的服务端部署,-Xms 和 - Xmx 设置为同样大小.与 - XX:MaxHeapSize 具有同样的作用.具体设置参考 [3]
-Xnoclassgc
关闭对 class 的 GC.这样设置可以节约一点 GC 的时间,不过带来的影响就是 class 永驻内存,不当的使用会导致 OOM 风险.
-XshowSettings:category
查看 settings 信息,category 可以是 all,locale,properties 和 vm 几部分.
-Xsssize
设置 thread stack 大小,一般默认的几个系统参数如下:
Linux/ARM (32-bit): 320 KB
Linux/i386 (32-bit): 320 KB
Linux/x64 (64-bit): 1024 KB
OS X (64-bit): 1024 KB
Oracle Solaris/i386 (32-bit): 320 KB
Oracle Solaris/x64 (64-bit): 1024 KB
-Xverify:mode
设置字节码校验器的模式,默认是 remote,即只校验那些不是通过 bootstrap 类加载器加载的字节码.而还有一个模式还 all,即全部都校验.虽然还有一个模式是 none,但是本质上 jvm 不生效这个参数.因为字节码校验是非常重要的,如果关闭,将可能导致 class 文件格式就是错的,这对于系统稳定和安全来说有重大风险.
高级运行时参数(Advanced Runtime Options)
这类参数控制 Java HotSpot VM 在运行时的行为.
-XX:+DisableAttachMechanism
设置 JVM 的 attach 模式,如果启动了这个参数,jvm 将不允许 attach,这样类似 jmap 等程序就无法使用了.
-XX:ErrorFile=filename
当不可恢复的错误发生时,错误信息记录到哪个文件.默认是在当前目录的一个叫做 hs_err_pid pid.log 的文件.如果指定的目录没有写权限,这时候文件会创建到 / tmp 目录下.使用如下:
-XX:ErrorFile=/var/log/java/java_error.log
-XX:MaxDirectMemorySize=size
为 NIO 的 direct-buffer 分配时指定最大的内存大小.默认是 0,意思是 JVM 自动选择 direct-buffer 的大小.使用如下:
-XX:MaxDirectMemorySize=1m
-XX:ObjectAlignmentInBytes=alignment
java 对象的内存对齐大小.默认是 8 字节,JVM 实际计算堆内存上限的方法是
4GB * ObjectAlignmentInBytes
-XX:OnError=string
在 jvm 出现错误 (不可恢复)的时候,执行哪些命令.具体例子如下:
-XX:OnError="gcore %p;dbx - %p"
-XX:OnOutOfMemoryError=string
同上,具体错误是 OOM.
-XX:-UseCompressedOops
禁止使用压缩命令来压缩指针引用.压缩指针是默认开启的,如果使用压缩命令压缩指针,可以在 JVM 内存小于 32G 时做到内存压缩,即在 64 位机器上做到内存指针对齐只占用 32 位而不是 64 位.这样对于小于 32G 的 JVM 有非常高的性能提升.该参数只在 64 位 JVM 有效.
-XX:+UseLargePages
使用大页内存 [4],默认关闭,使用该参数后开启.
高级 JIT 编译器参数(Advanced JIT Compiler Options)
这部分的参数主要在动态 just in time 编译时用到.
-XX:+BackgroundCompilation
后台编译,默认是开启的,如果要关闭,使用 - XX:-BackgroundCompilation 或者 - Xbatch.
-XX:CICompilerCount=threads
编译时的编译器线程数.server 版的 JVM 默认设置为 2,client 版本默认设置为 1.如果 tiered 编译开启,则会伸缩到核数个线程.
XX:CodeCacheMinimumFreeSpace=size
编译使用的最小空闲空间.默认是 500KB,如果最小空闲空间不足,则编译会停止.
-XX:CompileThreshold=invocations
编译前解释型方法调用次数.设置这个值,在编译前,会用解释器执行方法若干次用于收集信息,从而可以更高效率的进行编译.默认这个值在 JIT 中是 10000 次.可以通过使用 -Xcomp 参数来禁止编译时的解释执行.
-XX:+DoEscapeAnalysis
支持转义分析,默认是开启的.
-XX:InitialCodeCacheSize=size
初始化的 code cache 的大小,默认 500KB.这个值应该不小于系统最小内存页的大小.
-XX:+Inline
编译时方法内联.默认是开启的.
-XX:InlineSmallCode=size
设置最大内联方法的代码长度,默认是 1000 字节,只有小于这个设置的方法才会被编译内联.
-XX:+LogCompilation
编译时日志输出,在编译时会有一个 hotspot.log 的日志输出到当前工作目录下.可以用 - XX:LogFile 指定不同的目录.默认这个参数是关闭的,即编译日志不输出.这个参数需要和 - XX:UnlockDiagnosticVMOptions 一起使用.也可以使用 - XX:+PrintCompilation 选项在控制台打印编译过程信息.
-XX:MaxInlineSize=size
编译内联的方法的最大 byte code 大小.默认是 35,高于 35 个字节的字节码不会被内联.
-XX:+OptimizeStringConcat
字符串 concat 优化.默认开启.
-XX:+PrintAssembly
通过使用外部的disassembler.so库打印汇编的字节码和 native 方法来辅助分析.默认是不开启的,需要和 - XX:UnlockDiagnosticVMOptions 一起使用.
-XX:+PrintCompilation
将方法编译过程打印到控制台.默认不开启.
-XX:+PrintInlining
将内联方法打印出来.默认不开启.
-XX:ReservedCodeCacheSize=size
设置为了 JIT 编译代码的最大代码 cache 大小.这个设置默认是 240MB,如果关掉了 tiered 编译,则大小是 48MB.这个设置必须比初始化的 - XX:InitialCodeCacheSize=size 设置值大.
-XX:-TieredCompilation
关闭 tiered 编译,默认是开启的.只有 Hotspot 支持这个参数.
-XX:+UseCodeCacheFlushing
支持在关闭编译器之前清除 code cache.默认是开启的,要关闭就把 + 换成 -.
高级服务能力参数(Advanced Serviceability Options)
这部分参数可以做系统信息收集和扩展性的 debug.
-XX:+ExtendedDTraceProbes
支持 dtrace 探测,默认是关闭的.
-XX:+HeapDumpOnOutOfMemory
设置当java.lang.OutOfMemoryError发生时,将 heap 内存 dump 到当前目录的一个文件.默认是不开启的.
-XX:HeapDumpPath=path
设置在 dump heap 时将文件 dump 到哪里.默认是当前目录下 java_pidpid.hprof 这样形式的文件.指定文件时例子如下:
-XX:HeapDumpPath=/var/log/java/java_heapdump.hprof
-XX:LogFile=path
指定日志数据被记录在哪里,默认是在当前目录的 hotspot.log 下.设置例子如下:
-XX:LogFile=/var/log/java/hotspot.log
-XX:+PrintClassHistogram
支持打印类实例的直方图,在按下 ctrl+c 时(SIGTERM)触发.默认是关闭的.等价于运行 jmap -histo 命令或者 jcmd pid GC.class_histogram 命令.
-XX:+PrintConcurrentLocks
支持打印 java.util.concurrent 的锁信息,在 SIGTERM 时触发.默认关闭,等价于运行 jstack -l 或者 jcmd pid Thread.print -l 命令.
-XX:+UnlockDiagnosticVMOptions
解锁对 JVM 进行诊断的选项参数.默认是关闭的,开启后支持一些特定参数对 JVM 进行诊断.
高级垃圾回收参数(Advanced Garbage Collection Options)
这部分参数控制 JVM 如何进行垃圾回收(GC)
-XX:+AggressiveHeap
java 堆内存优化.默认是关闭的,如果开启后,针对一些长时间运行的且有密集的内存分配操作,JVM 根据系统 cpu 和内存的配置参数来进行优化.
-XX:+AlwaysPreTouch
支持在 JVM 启动时 touch 每一页,这样做会导致每页都会进入内存.可以用来模拟测试长时间运行的任务,将虚拟内存全部映射到物理内存.默认是关闭的.
-XX:+CMSClassUnloadingEnabled
支持 CMS 垃圾回收下的类卸载.默认是开启的.
-XX:CMSExpAvgFactor=percent
设置一个时间百分比,用来加权并发回收统计的指数平均的样本.默认是 25%.
-XX:CMSInitiatingOccupancyFraction=percent
设置一个年老代的占比,达到多少会触发 CMS 回收.默认是 - 1,任何一个负值的设定都表示了用 - XX:CMSTriggerRatio 来做真实的初始化值.设置方法如下:
-XX:CMSInitiatingOccupancyFraction=20
-XX:+CMSScavengeBeforeRemark
开启功能在 CMSremark 前进行 Scavenge.默认是关闭的.
-XX:CMSTriggerRatio=percent
设置一个在 CMS 开始前的内存的触发百分比,针对的是由 - XX:MinHeapFreeRatio 分配的内存.默认是 80.
-XX:ConcGCThreads=threads
设置支持并发 GC 的线程数.默认值依赖于给 JVM 的 CPU 数目.设置方法如:
-XX:ConcGCThreads=2
-XX:+DisableExplicitGC
关闭显式 GC 调用,即关闭 System.gc().默认是可以调用的.
-XX:+ExplicitGCInvokesConcurrent
支持通过 System.gc() 来做并发的 GC.默认是不支持的.该参数一定要和 - XX:+UseConcMarkSweepGC 一起使用.
-XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses
支持通过 System.gc() 来做并发的 GC 并且卸载类.默认是不支持的.该参数一定要和 - XX:+UseConcMarkSweepGC 一起使用.
-XX:G1HeapRegionSize=size
设置在使用 G1 收集器时 Java 堆被划分为子区域的大小.在 1MB 到 32MB 之间,默认会根据 Java 堆的大小自动检测.
-XX:+G1PrintHeapRegions
打印出哪些 region 是被分配的,哪些是被 G1 取回的.默认是关闭打印的.
-XX:G1ReservePercent=percent
设置一个堆内存的百分比用来作为 false ceiling,从而降低使用 G1 时晋升失败的可能性.默认是 10%.
-XX:InitialHeapSize=size
设置初始堆内存大小,需要设置为 0 或者 1024 的倍数,设置为 0 说明初始堆大小等于年轻代加年老代的大小.
-XX:InitialSurvivorRatio=ratio
设置初始的 survivor 空间占比,当使用 throughput 型的 GC 时有效(即 - XX:+UseParallelGC 或 -XX:+UseParallelOldGC).运行过程中 survivor 空间占比会自动根据应用运行调整,如果关闭了自适应调整策略(-XX:-UseAdaptiveSizePolicy),则 XX:SurvivorRatio 参数会成为 survivor 空间占比.计算 survivor 空间大小,依赖 young 的空间大小,计算公式如下
S=Y/(R+2)
其中 Y 是 young 空间大小,R 是 survivor 空间占比.一个例子就是如果 young 空间大小是 2MB,而 survivor 默认占比是 8,那么 survivor 的空间就是 0.2MB.
-XX:InitiatingHeapOccupancyPercent=percent
设置一个触发并发 GC 的堆占用百分比.这个值对于基于整体内存的垃圾回收器有效,比如 G1.默认是 45%,如果设置为 0 表示无停顿 GC.
-XX:MaxGCPauseMillis=time
设置一个最大的 GC 停顿时间(毫秒),这是个软目标,JVM 会尽最大努力去实现它,默认没有最大值设置.
-XX:MaxHeapSize=size
设置最大堆大小,这个值需要大于 2MB,且是 1024 的整数倍.等价于 - Xmx
-XX:MaxHeapFreeRatio=percent
设置在一次 GC 后最大的堆空闲空间占比.如果空闲堆空间超过这个值,堆空间会被收缩.默认是 70%.
-XX:MaxMetaspaceSize=size
为类的元数据进行分配的 metaspace 最大 native 内存大小,默认情况这个值无限制.该值依赖于当前的 JVM,其他在运行的 JVM 和系统可用内存.
-XX:MaxNewSize=size
设置最大的年轻代的堆大小.默认自动检测.
-XX:MaxTenuringThreshold=threshold
设置在自适应 GC 大小的使用占有最大阈值,默认对于 parallel(throughput)的是 15,对于 CMS 的是 6.
-XX:MetaspaceSize=size
设置一个 metaspace 的大小,第一次超出该分配后会触发 GC.默认值依赖于平台,该值会在运行时增加或减少.
-XX:MinHeapFreeRatio=percent
设置在一次 GC 后最小的空闲堆内存占比.如果空闲堆内存小于该值,则堆内存扩展.默认是 40%.
-XX:NewRatio=ratio
设置年轻代和年老代的比例,默认是 2.
-XX:NewSize=size
设置初始的年轻代的大小.年轻代是分配新对象的地方,是 GC 经常发生的地方.设置太低,会频繁 minor GC,设置太高的话就只会发生 Full GC 了.Oracle 推荐设置为整体内存的一半或者 1/4.该参数等价于 - Xmn.
-XX:ParallelGCThreads=threads
并行 GC 时的线程数.默认值是 CPU 数.
-XX:+ParallelRefProcEnabled
支持并发引用处理,默认是关闭的.
-XX:+PrintAdaptiveSizePolicy
打印自适应调整策略.默认关闭.
-XX:+PrintGC
打印每次 GC 的消息,默认是关闭的.
-XX:+PrintGCApplicationConcurrentTime
打印上次 GC 暂停到目前的时间.默认不打印.
-XX:+PrintGCApplicationStoppedTime
打印 GC 暂停的时间长度.默认不打印.
-XX:+PrintGCDateStamps
打印每个 GC 的日期时间戳.默认不打印.
-XX:+PrintGCDetails
打印每次 GC 的细节信息.默认不打印.
-XX:+PrintGCTaskTimeStamps
打印每个独立的 GC 线程任务的时间戳.默认不打印.
-XX:+PrintGCTimeStamps
打印每次 GC 的时间戳.默认不打印.
-XX:+PrintStringDeduplicationStatistics
打印细节的 deduplication 信息.默认不打印.
-XX:+PrintTenuringDistribution
打印所在的年龄代的信息.具体例子如下:
Desired survivor size 48286924 bytes,
new threshold 10(max 10) age 1 : 28992024 bytes,
28992024 total age 2 : 1366864 bytes,
30358888 total age 3 : 1425912 bytes,
31784800 total...
其中 age1 是最年轻的 survivor,age2 存活了 2 代,以此类推.默认该项关闭.
-XX:+ScavengeBeforeFullGC
在每次 Full GC 前做一次年轻代的 GC.该项默认是开启的.
-XX:SoftRefLRUPolicyMSPerMB=time
设置一个软引用对象在上次被引用后在堆内存中保存的时间.默认是每 1MB 保存 1 秒钟.该参数对于 client 模式和 server 模式有不同的动作,因为 client 模式 JVM 在回收时会强制 flush 掉软引用,然而 server 模式会尝试先扩容堆空间.
-XX:StringDeduplicationAgeThreshold=threshold
string 对象到达特定的 age 后会去除重复数据.默认是 3,jvm 中每次 gc 后存活的对象,age 会加一.string 对象在晋升为年老代之前都是去除重复数据的候选对象.
-XX:SurvivorRatio=ratio
eden 区和 survivor 区的比例.默认是 8.
-XX:TargetSurvivorRatio=percent
设置在 YGC 后的期望的 survivor 空间占比.默认是 50%.
-XX:TLABSize=size
设置 thread-local allocation buffer (TLAB) 的初始化大小.
-XX:+UseAdaptiveSizePolicy
使用自适应分代大小.默认是开启的.
-XX:+UseCMSInitiatingOccupancyOnly
设置使用占用值作为初始化 CMS 收集器的唯一条件.默认是不开启.
-XX:+UseConcMarkSweepGC
设置让 CMS 也支持老年代的回收.默认是不开启的,如果开启,那么 - XX:+UseParNewGC 也会自动被设置.Java 8 不支持 - XX:+UseConcMarkSweepGC -XX:-UseParNewGC 这种组合.
-XX:+UseG1GC
设置使用 G1 作为 GC 收集器.G1 比较推荐在大堆应用场景下使用(大于 6GB).
-XX:+UseGCOverheadLimit
设置一种策略用来设置一个时间比率来限制在 OOM 之前的 GC 时间.默认是开启的,并行 GC 时如果有多于 98% 以上的时间用来 gc 就会抛出 OOM.当堆空间较小时这个参数有助于保护应用程序不至于长时间的停顿没有进展.
-XX:+UseNUMA
使用 NUMA[5] 开启性能优化.默认不开启,该项只有在开启了 - XX:+UseParallelGC 后才有效.
-XX:+UseParallelGC
支持并行的垃圾收集器,即 throughput 垃圾收集.这可以在多核处理器下提升垃圾收集性能.默认不开启,收集器由系统根据 JVM 和机器配置自动选择.开启后 - XX:+UseParallelOldGC 选项也自动开启.
-XX:+UseParallelOldGC
支持 FULL GC 的并行收集器.默认不开启.
-XX:+UseParNewGC
支持在年轻代用多线程进行垃圾收集.默认不开启,使用 - XX:+UseConcMarkSweepGC 时会自动被开启.
-XX:+UseSerialGC
支持使用串行收集器.默认不开启.
-XX:+UseSHM
在 Linux 环境下支持 JVM 使用共享内存来设置大页.
-XX:+UseStringDeduplication
支持 string 的去重存储.默认关闭,要使用该选项,必须使用 G1 垃圾回收器 - XX:+UseG1GC.
-XX:+UseTLAB
在年轻代支持 thread-local 分配 block,默认开启.
来源: http://www.jianshu.com/p/4ae227a86d68