0%

JVM-Options

阅读更多

1 前言

本篇博客将介绍几类常用的JVM参数,JVM参数也就是写在java命令中的参数

-XX参数被称为不稳定参数,之所以这么叫是因为此类参数的设置很容易引起JVM性能上的差异,使JVM存在极大的不稳定性。当然这是在非合理设置的前提下,如果此类参数设置合理将大大提高JVM的性能及稳定性

可以说"不稳定参数"是一柄双刃剑,用的好攻无不克,用的差将带来麻烦。如何合理利用不稳定参数一直是一个不断实践不断改善的过程,无法用统一的标准去衡量。一切都需要在系统的不断运行,问题不断出现,参数不断修改,重新不断运行的循环过程中完善。也就是说没有最好的配置标准,只有适合当前系统的标准。这是一个循序渐进的过程。但有一些前人总结过得经验教训可供我们来参考,并去寻找适合自己的那些配置

2 语法规则

-X开头的参数表示非标准(non-standard),即不保证能够应用于所有JVM的实现,并且可能在之后后发布的JDK版本中更改

-XX开头的参数表示非稳定(not stable),并且可能在之后发布的JDK版本中更改

布尔类型参数值

  • -XX:+<option>:+表示启用该选项
  • -XX:-<option>:-表示关闭该选项

数值类型参数值

  • -XX:<option>=<number>:给选项设置一个数值类型值,可跟随单位,例如:'m’或’M’表示兆字节;'k’或’K’千字节;'g’或’G’千兆字节。32K与32768是相同大小的
  • 还有另一种数值类型,没有等于号,直接是参数名称后接数值。例如-Xms300m等等

字符串类型参数值

  • -XX:<option>=<string>:给选项设置一个字符串类型值,通常用于指定一个文件、路径或一系列命令列表。例如:-XX:HeapDumpPath=./dump.core

3 堆相关的内存大小设置

参数名称 类型 说明
-Xms<size> 数值类型 设置堆的初始化大小,这个数值必须是1024的倍数且大于1MB。不设置此参数时,堆的大小为新生代和老年代的总和。新生代的初始大小可由-Xmn或者-XX:NewSize进行设置。
-Xmx<size> 数值类型 设置内存池的最大值,数值必须是1024的倍数且大于2MB。默认值依赖于系统的配置。对于部署服务器而言,-Xms-Xmx通常设置成相同的数值。-Xmx参与与-XX:MaxHeapSize参数等价
-Xmn<size> 数值类型 设置新生代的初始值以及最大值(意味着使用该参数后新生代的大小就不再改变了)。新生代是用于存放新对象的区域,GC操作在此区域频繁发生。如果这个区域很小,那么将会增加Minor GC触发频率。如果这个区域很大,那么当触发Minor GC时,将会变得非常耗时。Oracle建议新生代的大小[0.25,0.5]*heapSize。为了避免-Xmn同时设定新生代的初始值以及最大值,我们可以用-XX:NewSize来设置初始值、-XX:MaxNewSize来设置最大值
-Xss<size> 数值类型 设置线程堆栈的大小。默认值依赖于虚拟内存。该参数与-XX:ThreadStackSize参数等价
-XX:InitialHeapSize=<size> 数值类型 设置内存池的初始大小,数值要么为0,要么是1024的倍数且大于1MB。默认值依赖于系统的配置。如果设置为0,那么初始内存池的大小就是新生代和老年代大小的总和
-XX:MaxHeapSize=<size> 数值类型 设置内存池的最大值,数值必须为1024的倍数且大于2MB。默认值依赖于系统的配置。对于服务器的部署,-XX:InitialHeapSize参数与-XX:MaxHeapSize参数通常设置成相同的值。该参数与-Xmx参数等价
-XX:NewSize=<size> 数值类型 设定新生代的初始值。新生代是用于存放新对象的区域,GC操作在此区域频繁发生。如果这个区域很小,那么将会增加Minor GC触发频率。如果这个区域很大,那么当触发Minor GC时,将会变得非常耗时。Oracle建议新生代的大小[0.25,0.5]*heapSize。
-XX:MaxNewSize=<size> 数值类型 设置新生代的最大值。具有默认值(set ergonomically)
-XX:ThreadStackSize=<size> 数值类型 设置线程的堆栈的大小。默认值依赖于虚拟内存。该参数与-Xss参数等价
-XX:PermSize=<size> 数值类型 设置永久代触发垃圾回收的临界值。超过这个临界值,将触发垃圾回收。这个参数在JDK 8被-XX:MetaspaceSize参数取代
-XX:MaxPermSize=<size> 数值类型 设置永久代大小的最大值。这个参数在JDK 8被-XX:MaxMetaspaceSize参数取代
-XX:MetaspaceSize=<size> 数值类型 设置元数据区触发垃圾回收的临界值。超过这个临界值将触发垃圾回收。这个阈值会随着metadata的使用情况而发生改变。默认值依赖于平台
XX:MaxMetaspaceSize=<size> 数值类型 设置元数据区的最大值。一般来讲,这个元数据的大小是无限制的,因为一个app元数据区的大小依赖于这个app本身,其他依赖的app以及系统所用的内存总和
-XX:NewRatio=<ratio> 数值类型 设置新生代与老年代大小的比值。默认值是2
-XX:SurvivorRatio=<ratio> 数值类型 设置Eden与Survivor的比值。默认是8。新生代分为一个Eden区域以及两个Survivor区域,采用复制算法,每次使用一个Eden与一个Survivor区域,因此在默认的设置情况下,内存使用率为(8+1)/(8+2)=90%
-XX:MaxTenuringThreshold=<threshold> 数值类型 分代晋升的阈值。当一个对象在新生代中经过<threshold>次Minor GC后仍然存活,那么这个对象将会从新生代移送至老年代。对于老年代较多的应用,适当降低这个阈值可以提高效率。如果将此值设为一个较大值,则新生代对象会在Survivor区进行多次复制,这样可以增加对象在新生代的存活时间,增加在新生代被回收的概率
  • <size>:此数值后面可接单位:k/K m/M g/G
  • <ratio>:整数,可以是小数吗?
  • <threshold>:整数

4 G1相关参数

参数名称 类型 说明
-XX:+UseG1GC 布尔类型 使用G1(garbage first)垃圾收集器。G1是一种服务器式垃圾收集器,面向具有大量RAM的多处理器机器。G1可以高概率地满足GC暂停时间目标,同时保持良好的吞吐量。G1收集器主要用于需要6GB或更大内存的应用,并且具有有限的GC等待时间要求(稳定且可预测的暂停时间低于0.5秒)
-XX:MaxGCPauseMillis=<time> 数值类型 设置GC暂停的最大时长。单位是milliseconds。这是一个非硬性指标,JVM会努力去逼近这个设定,但不一定保证实现。默认没有上限
-XX:InitiatingHeapOccupancyPercent=<percent> 数值类型 设置开始并发GC循环的堆占用百分比(0到100。垃圾收集器使用的触发并发GC循环,基于整个堆的占用,而不仅仅是一代(例如,G1垃圾收集器。默认情况下,初始值设置为45%。 值为0表示不间断GC循环。
-XX:NewRatio=<ratio> 数值类型 上文已经详细说明,此处不再赘述
-XX:SurvivorRatio=<ratio> 数值类型 上文已经详细说明,此处不再赘述
-XX:MaxTenuringThreshold=<threshold> 数值类型 上文已经详细说明,此处不再赘述
-XX:ParallelGCThreads=<threads> 数值类型 设置用于新生代和老年代中并行垃圾收集的线程数。默认值取决于JVM可用的CPU数量
-XX:ConcGCThreads=<threads> 数值类型 设置用于并发GC的线程数。默认值取决于JVM可用的CPU数量
-XX:G1ReservePercent=<percent> 数值类型 设置作为空闲空间的预留内存百分比(0-50),以降低目标空间溢出的风险。默认值是10
-XX:G1HeapRegionSize=<size> 数值类型 设置G1 Region的大小(G1收集器用Region来代替新生代老年代,同时仍保留新生代老年代的概念,只不过在G1收集器中,新生代老年代不再物理分离,而是位于不同的Region而已)。可以设置为1MB到32MB之间的数值。默认值取决于堆的大小

5 并行收集器相关参数

参数名称 类型 说明
-XX:+UseParallelGC 布尔类型 使用并行清除垃圾收集器(也称为吞吐量收集器)来利用多个处理器来提高应用程序的性能。该参数默认不设置,并根据机器的配置和JVM的类型自动选择收集器。 当设置-XX:+UseParallelGC参数时,则-XX:+ UseParallelOldGC参数将自动设置,除非您明确禁用它
-XX:+UseParNewGC 布尔类型 在新生代中使用并发收集器。该参数默认不设置。当设置-XX:+UseConcMarkSweepGC参数时,则-XX:+UseParNewGC参数将自动设置。 JDK 8中不允许设置-XX:+UseParNewGC参数而不设置-XX:+UseConcMarkSweepGC参数
-XX:+UseParallelOldGC 布尔类型 在老年代(对应Full GC)中启用并发收集器。该参数默认不设置。当设置-XX:+UseParallelGC参数时,则-XX:+UseParallelOldGC参数将自动设置
-XX:MaxGCPauseMillis=<time> 数值类型 上文已经详细说明,此处不再赘述
-XX:GCTimeRatio=<ratil> 数值类型 设置吞吐量的大小(吞吐量 = 运行用户代码的时间/(运行用户代码的时间 + 垃圾收集时间))。该参数的值应当是一个大于0小于100的整数,若设置为19,则意味着允许的最大GC时间占总时间的5%=1/(1+19)默认为99,即1%=1/(1+99)
-XX:ParallelGCThreads=<threads> 数值类型 上文已经详细说明,此处不再赘述
-XX:+UseAdaptiveSizePolicy 布尔类型 启动自适应的比例(Eden与Survivor的比值)配置。该参数默认设置。若要禁用,则必须显式设置-XX:-UseAdaptiveSizePolicy参数,并且设置-XX:SurvivorRatio参数
-XX:+ScavengeBeforeFullGC 布尔类型 在Full GC之前先进行一次Minor GC。此参数默认设置。Oracle建议不要禁用该参数,because scavenging the young generation before a full GC can reduce the number of objects reachable from the old generation space into the young generation space

6 CMS相关参数

参数名称 类型 说明
-XX:+UseConcMarkSweepGC 布尔类型 在老年代中启用CMS并行收集器。Oracle建议您在吞吐量-XX:+ UseParallelGC垃圾收集器无法满足应用程序延迟要求时,使用CMS垃圾收集器。 G1垃圾回收器-XX:+ UseG1GC是另一种选择。此参数默认不设置,并根据机器的配置和JVM的类型自动选择收集器。启用此选项时,将自动设置-XX:+ UseParNewGC参数,并且不应禁用该参数。JDK 8禁止这样设置:-XX:+UseConcMarkSweepGC-XX:-UseParNewGC(即不能启用CMS的同时禁用ParNew)
-XX:+AggressiveHeap 布尔类型 启动堆优化,根据计算机(RAM和CPU)的配置进行优化,能够提升那些长时间运作的应用的性能。该参数默认不设置,即堆不会优化
-XX:CMSFullGCsBeforeCompaction=<n> 数值类型 由于并发收集器不对内存空间进行压缩、整理。所以运行一段时间以后会产生"碎片",碎片使得运行效率降低。此值设置运行多少次Full GC以后对内存空间进行压缩、整理。该参数默认为0,即每次Full GC都会进行碎片整理
-XX+UseCMSCompactAtFullCollection 布尔类型 CMS采用标记-清除算法,容易产生内存碎片,浪费内存资源。该参数启用内存压缩,清理碎片,可能会影响性能,但是可以消除碎片
-XX:+UseCMSInitiatingOccupancyOnly 布尔类型 允许使用占用值作为启动CMS收集器的唯一标准。 默认情况下,此选项被禁用,并且可以使用其他条件。
-XX:CMSInitiatingOccupancyFraction=<percent> 数值类型 由于CMS存在并发清理过程,即清理时用户线程继续运行,因此可能产生垃圾,所以在触发Full GC时,需要预留空间供用户线程使用。该参数设置触发CAS进行Full GC的内存占用比(0到100)。默认为-1,任何负值包括默认值,意味着需要设置-XX:CMSTriggerRatio来定义初始占用比
-XX:CMSInitiatingPermOccupancyFraction=<percent> 数值类型 设置永久代触发GC的占用比,此参数在JDK 8中被弃用,且无替代参数
-XX:+CMSIncrementalMode 布尔类型 启用增量式的CMS收集器。该参数在JDK 8中被弃用,且无替代参数

7 参考