JAVA命令行工具(一)--JAVA垃圾回收选项

紧接前一文JAVA命令行工具(一)--JAVA,垃圾回收由于有较多选项,所以单独成篇,关于选项的通用描述可参见前文。

1 通用参数

-XX:InitialHeapSize=size
  设置Java堆的初始大小,同-Xms
-XX:MaxHeapSize=size
  设置Java堆的最大大小,同-Xmx
-XX:NewSize=size
  设置新生代的初始大小,同-Xmn
-XX:MaxNewSize=size
  设置新生代的最大大小,默认值自动设置。
-XX:MetaspaceSize=size
  设置Java类元数据空间触发垃圾回收的阈值,当使用的类元数据所占的空间首次超过该值将触发垃圾回收。该阈值会随着类元数据所占空间的变化而变化,其默认值取决于具体的操作系统。
-XX:MaxMetaspaceSize=size
  设置存储Java类元数据的最大空间,默认没有限制。
-XX:NewRatio=ratio
  设置新生代和老年代的相对大小。该选项的默认值为2,表示新生代和老年代的比率为2:1即新生代占整个堆的2/3,老年代占整个堆的1/3。这种设置方式的优点是:新生代的大小随着堆大小的改变而改变。该选项和设置绝对大小的选项一起使用将同时生效,如下的选项设置:

     -XX:NewSize=32m -XX:MaxNewSize=512m -XX:NewRatio=3

JVM会尝试为新生代分配1/4的堆大小,但不会小于32MB,也不会大于512MB。
-XX:SurvivorRatio=ratio
  设置Survivor和Eden的相对大小,该选项作用于新生代内部。为了明白该选项的含义,需要了解新生代的空间划分,一个简单的示意如下:

    |  Eden  | From(S0) | To(S1) | // Trom和To都是Survivor且大小相同

该选项表示Eden区和两个Surivior区的比率,默认值为8,即各区的比例为Eden:S0:S1=8:1:1。如果Eden区过大,在一次GC后幸存的对象过多以至于Survivor区不能容纳,那么大部分对象在一次GC后就会转移到老年代;如果Eden区过小,意味着新对象的产生将很快耗尽Eden区,从而增加新生代GC次数。
-XX:TargetSurvivorRatio=percent
  设置Survivor区的使用率,当Surviivor的使用率达到该值时,JVM将会动态调节新生代对象晋升到老年代对象的年龄阈值,从而让年龄过大的对象尽早转移到老年代。默认值为50,表示允许50%的Survivor空间被使用。
-XX:+UseAdaptiveSizePolicy
  允许JVM动态调节新生代各区的大小。该选项默认开启,如果需要关闭,需要显式指定新生代各区的大小,可参考-XX:SurvivorRatio
-XX:MaxTenuringThreshold=threshold
  设置新生代晋升到老年代的年龄阈值,当新生代对象的年龄超过该阈值时将被转移到老年代。该选项的默认值随收集器不同而不同,并行收集器默认15,CMS收集器默认为6。由于该值用4个bit存储在JAVA对象头中,故该选项的最大值为15。
-XX:+AggressiveHeap
  开启Java堆优化,根据计算机的配置(CPU和内存)设置大量参数用于优化长时间运行任务的内存分配。该选项默认关闭。
  在非官方文档中,有说明该选项将使JVM尽可能多的占用物理内存,并使-Xmx选项失效;根据该选项英文名猜测可能有此种含义,还需确认,欢迎在评论中指出和讨论。
-XX:MaxHeapFreeRatio=percent
  设置一次GC后Java堆允许空闲的最大比率,如果空闲堆空间超过该选项指定的比率,Java堆空间将缩小。默认情况下,该选项的值为70,表示允许70%的空闲。
-XX:MinHeapFreeRatio=percent
  设置一次GC后Java堆允许空闲的最小比率,如果空间堆空间小于该选项指定的比率,Java堆空间将扩大。默认情况下,该选项的值为40%,表示至少需要40%的空闲。
-XX:+ShrinkHeapInSteps
  使Java堆渐进地缩小到目标大小,该选项默认开启,经过多次GC后堆缩小到目标大小;如果关闭该选项,那么GC后Java堆将立即缩小到目标大小。如果希望最小化Java堆大小,可以关闭改选项,并配合以下选项:

    -XX:MaxHeapFreeRatio=10 -XX:MinHeapFreeRatio=5

这样将保持Java堆空间较小,并减少程序的动态占用空间,这对嵌入式应用非常有用,但对于一般应用,可能降低性能。
-XX:MaxGCPauseMillis=time
  设置GC停顿的最大时间,单位毫秒。该选项为GC设定一个目标优化值,JVM将尽可能完成该目标,但并不保证一定完成。最新版本的JDK没有设置最大值,JDK8设定默认值为200毫秒。
-XX:+Scavenge BeforeFullGC
  执行Full GC前首先执行新生代的GC,该选项默认开启。官方强烈建议开启改选项,因为在Full GC前对新生代执行Scavenge GC可以减少晋升到老年代的对象。
-XX:+ParallelRefProcEnabled
  启用并行处理引用功能,开启该选项后,将使用多线程并行处理引用,该选项默认关闭。
-XX:+DisableExplicitGC
  该选项关闭调用System.gc()方法的处理,默认关闭该选项,也就是说,默认将会处理System.gc()方法。注意,不处理System.gc()调用,但JVM仍然会在合适的时候进行GC。

2 并行GC参数

以下这些参数适用于并行GC,即ParallelGC和ParallelOldGC,启用并行GC回收器,可使用选项-XX:+UseParallelGC-XX:+UseParallelOldGC

-XX:InitialSurvivorRatio=ratio
  该选项与-XX:SurvivorRatio含义相同,设置新生代的Eden区和Survivor区的比例,默认值同样为8,表示10M的新生代,将初始化8M的Eden区和两个1M的Survivor区。该选项只适用于并行GC,如果并行GC同样配置了-XX:SurvivorRatio,则优先以本选项为准。
-XX:+UseGCOverheadLimit
  在JVM抛出OutOfMemoryError异常之前,允许限制JVM花费在GC上的时间比率。默认情况下,该选项开启,如果花费超过98%的时间进行垃圾回收但回收的堆空间小于2%,将会抛出OutOfMemoryError异常(仅对parallel GC有用)。当堆空间很小时,可以使用该特性来阻止应用长时间不处理请求或处理进度过低。
-XX:ParallelGCThreads=n
  设置STW工作线程的数量。如果逻辑处理器的数量不超过8,该值设置为与逻辑处理器数量相同;如果逻辑处理器数量大于8,则一般设置为逻辑处理器数量的5/8。该选项的默认值取决于JVM可用的CPU数量。

3 并发GC参数

以下这些参数使用于并发GC,即G1 GC和ConcMarkSweepGC,启用并发GC回收器,可使用选项-XX:+UseG1GC-XX:+UseConcMarkSweepGC

-XX:ConcGCThreads=threads
  设置并发GC的线程数。一般将该值设置为并行GC线程数(由ParallelGCThreads指定)的1/4。该选项的默认值取决于JVM可用的CPU数量。
-XX:InitiatingHeapOccupancyPercent=percent
  设置开始并发GC的堆使用率阈值,当整个堆的使用率达到该选项指定的值,将触发一次并发GC。该选项的默认值为45,即堆使用率达到45%后,开始进行并发GC。
-XX:+ExplicitGCInvokesConcurrent
  启用System.gc()方法调用并发GC的功能,该选项默认关闭。

3.1 G1 GC选项

-XX:G1HeapRegionSize=size
  设置Java堆划分为Region区的大小。该选项的值需要为2的次数,且介于[1MB,32MB]之间,目标是将Java堆划分为约2048个Region区。该选项的默认值由JVM根据Java堆大小自动计算。
-XX:G1HeapWastePercent=percent
  设置希望浪费的Java堆比例。当可回收的空间小于该选项设置的比例时,JVM不会进行混合(Mixed)垃圾回收。该选项的默认值是5。
-XX:G1ReservePercent=percent
  设置Java堆的保留空间占比,以便对可能的晋升(新生代晋升老年代)失败进行容错处理。该选项的默认值是10,可设置的区间为[0,50]。
-XX:+UseStringDeduplication
  启用字符串去重功能。该选项默认关闭,开启该选项将会减少字符串占用的内存空间。这是因为启用该功能后,如果两个字符串含有相同的底层字符数组,那么这两个字符串将会共享相同的底层字符数组。
–XX:StringDeduplicationAgeThreshold=threshold
  设置进行去重的字符串在GC中的年龄阈值。大部分字符串对象生命周期都很短,如果盲目去重将浪费CPU资源。对多次GC之后仍然存活的字符串对象进行去重才是较好的选择。该选项的默认值是3,此外,Old区的字符创对象则会一直进行去重。

以下的选项都是实验性质的选项,需要在HotSpot VM build 23之后才可使用。
-XX:G1MaxNewSizePercent=percent
  设置新生代在Java堆的最大占比,该选项的默认值为60,且会覆盖-XX:DefaultMaxNewGenPercent选项。
-XX:G1MixedGCLiveThresholdPercent=percent
  设置Old区在混合垃圾回收中的占比,该选项的默认值为85,且会覆盖-XX:G1OldCSetRegionLiveThresholdPercent选项。
-XX:G1MixedGCCountTarget=number
  设置标记周期完成后,对存活数据上限为G1MixedGCLIveThresholdPercent 的OLd区执行混合垃圾回收的目标次数。默认值是8,混合回收的目标是要控制在此目标次数以内。
-XX:G1NewSizePercent=percent
  设置新生代在Java堆的最小占比,该选项的默认值是5。
-XX:G1OldCSetRegionThresholdPercent=percent
  设置混合回收期间回收Old区的最大数量,该选项的默认值是10。

3.2 CMS GC选项

-XX:+CMSClassUnloadingEnabled
  启用类卸载功能,该选项默认开启。
-XX:+CMSScavengeBeforeRemark
  启用CMS在重新标记阶段之前的清除尝试,该选项默认开启,即在Remark阶段之前进行一次Young GC以便减少remark的耗时。
-XX:CMSInitiatingOccupancyFraction=percent
  设置触发CMS回收的老年代空间占比,即当老年代占用空间超过该选项指定的值,那么进行一次CMS回收。该选项的默认值为-1,此时该阈值由以下公式确定:

    occupancyFraction = ((100 - MinHeapFreeRatio) + (double)( CMSTriggerRatio * MinHeapFreeRatio) / 100.0) / 100.0

默认情况下,MinHeapFreeRatio的值为40,CMSTriggerRatio的值为80,带入该公式,结果为92%,即默认情况,老年代达到92%时触发CMS回收。该选项在JDK10中已被标记为Deprecated
-XX:CMSTriggerRatio=percent
  与选项-XX:MinHeapFreeRatio一起用于计算触发CMS回收的条件值,该选项的默认值为80。
-XX:+UseCMSInitiatingOccupancyOnly
  将老年代占比阈值设定为触发CMS回收的唯一条件。该选项默认关闭,JVM通过收集运行时数据等综合因素触发垃圾回收,仅在第一次垃圾回收时使用老年代占比阈值。除非对应用产生的对象生命周期有深刻认识,才应该启用该选项。
-XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses
启用System.gc()方法调用并发GC和卸载类的功能,该选项默认关闭。

你可能感兴趣的:(JAVA命令行工具(一)--JAVA垃圾回收选项)