小李教你一文搞定JVM参数设置

镇楼类(终端执行):

java -XX:+PrintFlagsInitial 表示打印出所有参数选项的默认值
java -XX:+PrintFlagsFinal 表示打印出所有参数选项在运行程序时生效的值

 

通用类:

-XX:+PrintGC 使用这个参数,虚拟机启动后,只要遇到GC就会打印日志

-XX:+PrintGCDetails 可以查看详细信息,包括各个区的情况

-Xms:设置Java程序启动时初始化堆大小

-Xmx:设置Java程序能获得最大的堆大小

-XX:MaxTenuringThreshold 分代年龄默认值15 达到15次后会进入老年代(ZGC除外,基于分代理论的垃圾收集器通用)

XX:+UseSerialGC:串行回收器  单核(一般没用 自己比较抠开的虚拟机可以用)

XX : MetaspaceSize = 256 M XX : MaxMetaspaceSize = 256 M  元空间大小指定,最好采用固定值的形式。
 

日志:

打印GC日志方法,在JVM参数里增加参数, %t 代表时间
  Xloggc :. / gc ‐% t . log            日志储存的位置。
XX : + PrintGCDetails           可以查看详细信息,包括各个区的情况
XX : + PrintGCDateStamps  输出GC的时间戳(以基准时间的形式)
XX : + PrintGCTimeStamps  输出GC的时间戳(以日期的形式,如 2013-05-04T21:53:59.234+0800)
XX : + PrintGCCause
XX : + UseGCLogFileRotation  日志整理
XX : NumberOfGCLogFiles = 10  10个
XX : GCLogFileSize = 100 M         100M
 
内存4G及以下(在注重CPU资源和吞吐量的情况下Parallel Scavenge 和 Parallel Old )jdk8 默认 
-XX:+UseParallelOldGC 启用

Parallel Scavenge:

-XX:MaxGCPauseMillis,最大垃圾回收停顿时间。这个参数的原理是空间换时间,收集器会控制新生代的区域大小,从而尽可能保证回收少于这个最大停顿时间。简单的说就是回收的区域越小,那么耗费的时间也越小。
所以这个参数并不是设置得越小越好。设太小的话,新生代空间会太小,从而更频繁的触发GC。
-XX:GCTimeRatio,垃圾回收时间与总时间占比。这个是吞吐量的倒数,原理和MaxGCPauseMillis相同。
因为Parallel Scavenge收集器关注的是吞吐量,所以当设置好以上参数的时候,同时不想设置各个区域大小(新生代,老年代等)。可以开启**-XX:UseAdaptiveSizePolicy**参数,让JVM监控收集的性能,动态调整这些区域大小参数。

内存8G左右 .ParNew&CMS

CMS的相关核心参数

1. -XXx:+UseConcMarkSweepGC:启用cms

2. -XX:ConcGCThreads:并发的GC线程数 默认

3. -XX:+UseCMSCompactAtFullCollection: FullGC之 后做压缩整理(减少碎片)

4. -XX:CMSFullGCsBeforeCompaction:多少次FullGC之后压缩- -次。默认是0,代表每次FullGC后都会压缩一

5. -XX:CMSInitiatingOccupancyFraction:当老年代使用达到该比例时会触发FulIGC (默认是92,这是百分比)6. -XXx:+UseCMSInitiatingOccupancyOnly:只使用设定的回收阈值(-XX:CMSInitiatingOccupancyFraction设 定的值),如果不指定,JVM仅在第- -次使用设定值, 后续则会自动调整

7. -XX:+ CMSScavengeBeforeRemark:在CMS GC前启动- -次minor gc,目的在于减少老年代对年轻代的引 用,降低CMS GC的标记阶段时的开销,一般CMS的GC耗时 80%都在标记阶段

8. -XX:+ CMSParallellnitialMarkEnabled:表示在初始标记的时候多线程执行,缩短STW

9. -XX:+ CMSParallelRemarkEnabled:在重新标记的时候多线程执行,缩短STW;

10.ParNew&CMS -XX:UseParNewGC -XXx:+UseConcMarkSweepGC
模板:

  Xloggc :. / gc ‐% t . log             XX : + PrintGCDetails            XX : + PrintGCDateStamps   XX : + PrintGCTimeStamps  
 ‐ XX : + PrintGCCause XX : + UseGCLogFileRotation   XX : NumberOfGCLogFiles = 10   XX : GCLogFileSize = 100
 -XX:UseParNewGC  -XXx:+UseConcMarkSweepGC     XX : MetaspaceSize = 512 M XX : MaxMetaspaceSize = 512 M
-XX:MaxTenuringThreshold=10 -Xms:4096M -Xmx:6144M  -XX:+ CMSParallellnitialMarkEnabled 
-XX:+ CMSParallelRemarkEnabled -XX:+ CMSScavengeBeforeRemark -XX:CMSFullGCsBeforeCompaction=3
 
16G及以上必用G1:

          使用G1 :-XX:+UseG1GC  (GDK11默认就是哦)

          堆的大小: -Xmx32g

           最大停顿时间:-XX:MaxGCPauseMillis=200 (默认就是200 毫秒  别作死调到10  根据需求和硬件环境设定。其实200还好吧。)

           设置的 G1 区域(Region)的大小:-XX:G1HeapRegionSize=n(值是 2 的幂,范围是 1 MB 到 32 MB 之间。目标是根据最小的 Java 堆大小划分出约 2048 个区域)

           设置 STW 工作线程数的值:-XX:ParallelGCThreads=n(默认等于CPU核数不推荐改哦)

           并行标记的线程数:XX:ConcGCThreads=n

新生代比例:新生代比例有两个数值指定,下限:-XX:G1NewSizePercent,默认值5%,上限:-XX:G1MaxNewSizePercent,默认值60%。

被纳入Cset的Region的存活空间占比阈值:通过 -XX:G1MixedGCLiveThresholdPercent 默认65%

触发全局并发标记的老年代使用占比:通过-XX:InitiatingHeapOccupancyPercent指定,默认值45%

 -XX:G1ReservePercent=n 设置堆内存保留为假天花板的总量,以降低提升失败的可能性. 默认值是 10

  模板:

 Xloggc:./gc‐%t.log            XX:+PrintGCDetails           XX:+PrintGCDateStamps  XX:+PrintGCTimeStamps

XX:+PrintGCCause XX:+UseGCLogFileRotation  XX:NumberOfGCLogFiles=10  XX:GCLogFileSize=100

 XX:MetaspaceSize=512M XX:MaxMetaspaceSize=512-XX:+UseG1GC 

-XX:MaxTenuringThreshold=10 -Xmx:16384M  -XX:MaxGCPauseMillis=200  -XX:G1NewSizePercent=10
 -XX:G1ReservePercent=10  -XX:G1MixedGCLiveThresholdPercent=70
 
 
G1参数  参考文章: https://blog.csdn.net/qq_27529917/article/details/87072130
 

 

 

 

 

你可能感兴趣的:(JVM与垃圾调优专栏,java,jvm)