JVM

JVM参数

Posted by Charlie on 2019-06-14

选项的分类

Hotspot JVM提供以下三大类选项:

  1. 标准选项:这类选项的功能是很稳定的,在后续版本中也不太会发生变化。运行java或者java -help可以看到所有的标准选项。所有的标准选项都是以-开头,比如-version, -server等。
  2. X选项:比如-Xms。这类选项都是以-X开头,可能由于这个原因它们被称为X选项。运行java -X命令可以看到所有的X选项。这类选项的功能还是很稳定,但官方的说法是它们的行为可能会在后续版本中改变,也有可能不在后续版本中提供了。
  3. XX选项:这类选项是属于实验性,主要是给JVM开发者用于开发和调试JVM的,在后续的版本中行为有可能会变化。

XX选项的语法

内存相关

参数 描述
-Xms 最小堆内存
-Xmx 最大堆内存
-Xss 栈容量
-XX:+HeapDumpOnOutOfMemoryError 表示在内存出现OOM的时候,把Heap转存(Dump)到文件以便后续分析,文件名通常是java_pid.hprof,其中pid为该程序的进程号。
-XX:HeapDumpPath=: 用来指定heap转存文件的存储路径,需要指定的路径下有足够的空间来保存转存文件。-XX:HeapDumpPath=/tmp/heapdump.hprof
-XX:OnOutOfMemoryError 用来指定一个可行性程序或者脚本的路径,当发生OOM的时候,去执行这个脚本。-XX:OnOutOfMemoryError =“sh ~/cleanup.sh”
-XX:NewSize 新生代的最小值
-XX:MaxNewSize 新生代的最大值
-XX:NewRatio 用来设置老生代和新生代大小的比例,比如-XX:NewRatio=2表示1/3的Heap是新生代,2/3的Heap是老生代。使用这个选项的好处是新生代的大小也能随着Heap的变化而变化。
MaxDirectMemorySizes 本机直接内存最大值

GC日志相关

参数 描述
-XX:+PrintGC 等同于-verbose:gc 表示打开简化的GC日志,相关输出如下:
[GC 425355K->351685K(506816K), 0.2175300 secs]
[Full GC 500561K->456058K(506816K), 0.6421920 secs]
-XX:+PrintGCDetails 这个选项会打印出更多的GC日志,不同的收集器产生的日志会不一样。
-XX:+PrintGCTimeStamps 把GC的时间戳显示在GC的日志中,打印GC发生的时间相对于JVM启动的时间
-XX:+PrintGCDateStamps 把GC的时间戳显示在GC的日志中,打印出GC发生的具体时间。
-Xloggc: 表示把GC日志写入到一个文件中去,而不是打印到标准输出中。

垃圾收集器相关

参数 描述
-XX:+UseSerialGC 虚拟机运行在Client模式下的默认值,打开此开关,使用Serial+Serial Old收集器组合
-XX:+UseParNewGC 打开此开关,使用ParNew+Serial Old 组合
-XX:+UseConcMarkSweepGC 打开此开关,使用ParNew + CMS + Serial Old组合,Serial Old作为CMS出现 Concurrent Mode Failure 失败后的后背收集器
-XX:+UseG1GC 打开此开关后,使用G1 收集器
-XX:+UseParallelGC 虚拟机运行在Server模式下的默认值,打开此开关后,使用 Parallel Scavenge + Serial Old(PS MarkSweep)组合
-XX:+UseParallelOldGC 打开此开关后,使用Parallel Scavenge + Parallel Old的组合
-XX:+SuvivorRatio 新生代中,Eden区域与Survivor区域的容量比值,默认为8,代表Eden:Survivor=8:1
-XX:+PretenureSizeThreshold 对象直接晋升到老年代的对象大小,设置此参数后,大于此参数的对象将直接分配在老年代
-XX:+MaxTenuringThreshold 对象晋升到老年代的年龄(默认为15)。每个对象在坚持过一次Minor GC之后,年龄加1,当超过这个参数值时,就进入老年代
-XX:+UseAdaptiveSizePolicy 对台调整Java堆中各个区域的大小以及进入老年代的年龄
-XX:+HandlePromotionFailure 是否允许分配担保失败,即老年代的剩余空间不足以应付新生代的整个Eden和Survivor区的所有对象都存活的几段情况
-XX:+ParallelGCThreads 设置并行GC时进行内存回收的线程数
-XX:+GCTimeRatio GC时间占总时间的比率,默认值为99,即允许1%的GC时间,仅在使用Parallel Scavenge收集器时生效
-XX:+MaxGCPauseMillis 设置GC的最大停顿时间。仅在使用Parallel Scavenge收集器时生效
-XX:+CMSInitiatingOccupancyFraction 设置CMS收集器在老年代空间被使用多少后触发垃圾收集。默认值为68%,仅在使用CMS收集器时生效
-XX:+UseCMSCompactAtFullCollection 设置CMS收集器在完成垃圾收集后是否要进行一次内存碎片整理。仅在使用CMS收集器时生效
-XX:+CMSfullGCsBeforeCompaction 设置CMS收集器在进行若干次垃圾收集后再启动一次内存碎片整理。仅在使用CMS收集器时生效

其他

参数 描述
-XX:+PrintCommandLineFlags 与-showversion类似
可以让在程序运行前打印出用户手动设置或者JVM自动设置的XX选项
建议加上这个选项以辅助问题诊断
java -XX:+PrintCommandLineFlags -version
不能指定具体的LVMID?
-XX:+PrintFlagsInitial 打印出所有XX选项的默认值
-XX:+PrintFlagsFinal 打印出XX选项在运行程序时生效的值

参考资料

【Hotspot JVM的常用选项】https://www.zybuluo.com/jewes/note/57352