一、垃圾回收
-- 选择一个好的垃圾收集器:吞吐量最大时,停顿时间最小
停顿时间: XX:MaxGCPauseMillis=200 --垃圾收集器做垃圾回收中断应用执行的时间 毫秒
吞吐量: XX:GCTimeRatio=<n> 百分比,垃圾收集时间占:1/1+n -- 花在垃圾收集时间和应用时间的占比

1、串行收集器 -- 单线程 (暂停应用执行,单条线程执行垃圾回收)
-XX:+UseSerialGC young区设置
-XX:+UseSerialOldGc old区设置
2、并行收集器 -- 吞吐量优先 (暂停应用执行,多条线程执行垃圾回收,适合科学计算,后台处理等弱交互场景)
-- Server模式下的默认收集器
-XX:+UseparallelGC young区
-XX:+UseParallelOldGC old区
-XX:ParallelGCThreads=<N>多少个GC线程 (默认:CPU>8 N=5/8,CPU<8 N=CPU)
3、并发收集器(CMS Concurrent Mark Sweep) -- 停顿时间优先 (应用执行线程与垃圾回收线程交替执行,适合响应时间要快等 例如web场景)
-XX:+UseParNewGC young区
-XX:+UseConcMarkSweeepGC old区
-XX:CMSInitiatingOccupancyFraction=92 触发fullGC(默认92%)
-XX:+UseCMSCompactAtFullCollection
-XX:CMSFullGCsBeforeCompaction=5
-XX:+UseCMSInitiatingOccupanyOnly:是否动态调
-XX:+CMSScavengeBeforeRemark:FullGC之前先做YGC
-XX:+CMSClassUnloadingEnabled:启用回收Perm区
4、G1收集器(jdk9以后为默认收集器)
-XX:+UseG1GC -- 开启G1
-XX:G1HeapRegionSize=n, region的大小,1-32M,2048个
-XX:MaxGCPauseMillis=200 最大停顿时间------
-XX:G1NewSizePercent young区占比
-XX:G1MaxNewSizePercent 最大young区占比
-XX:G1ReservePercent=10 保留防止to space溢出
-XX:ParallelGCThreads=n SWT线程数
-XX:ConcGCThreads=n 并发线程数=1/4* 并行
UseStringDeduplication(bool):开启String去重
PrintStringDeduplicationStatistics(bool):打印详细的去重统计信息
StringDeduplicationAgeThreshold(unitx):达到这个年龄的string对象被转区old区
4(1)、mixedGc(全局并发标记)
-XX:InitiatingHeapOccupancyPercent --初始堆占有比例
-XX:G1MixedGCLiveThresholdPercent、
-XX:G1HeapWastePercent 默认5% 当标记完后垃圾占比达到该值时发生回收 (mixedGc)
-XX:G1MixedGCCountTarget
-XX:G1OldCSetRegionThresholdPercent --调整CSet for old regions
二、打印GC日志
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:+PrintGCDateStamps
-Xloggc:$CATALINA_HOME/logs/gc.log
-XX:+PrintHeapAtGC
-XX:+PrintTenuringDistribution
三、生产环境时打开(先选择GC算法)
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=$CATALINA_HOME/logs/
-XX:+DisableExplicitGC 禁止手动代码通知进行垃圾回收
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:+PrintGCDateStamps
-Xloggc:$CATALINA_HOME/logs/gc.log
调优:工具gcVIEWER导入gc.log文件
除非确定,否则不要设置最大堆内存
优先设置吞吐量目标
如果吞吐量目标达不到,调大最大内存,不能让OS使用Swap,如果仍然达不到,降低目标
吞吐量能达到,GC时间太长,设置停顿时间的目标
吞吐量 最小停顿 最大停顿 平均停顿 YGC次数 FULLGC(并行(Parallel)收集器存在)
96.33 0.00122s 0.03625s 0.01956 11 3
-XX:YoungGenerationSizeIncrement=30 (当发生youngGC时动态扩增Young区 默认为20)
表 10-1 G1 垃圾收集器重要选项的默认值
选项和默认值 | 选项 |
---|---|
| 设置 G1 区域的大小。该值是 2 的幂,范围可以从 1 MB 到 32 MB。目标是根据最小 Java 堆大小拥有大约 2048 个区域。 |
| 设置所需最大暂停时间的目标值。默认值为 200 毫秒。指定的值不适合您的堆大小。 |
| 设置用作年轻代大小最小值的堆百分比。默认值为 Java 堆的 5%。脚1 这是一个实验性的标志。有关示例,请参阅如何解锁实验 VM 标志。此设置取代了该 |
| 设置用作年轻代大小最大值的堆大小百分比。默认值为 Java 堆的 60%。脚参考1 这是一个实验性的标志。有关示例,请参阅如何解锁实验 VM 标志。此设置取代了该 |
| 设置 STW 工作线程的值。将 的值设置 如果逻辑处理器数量超过 8 个,则将n的值设置为逻辑处理器的大约 5/8。这在大多数情况下都适用,但较大的 SPARC 系统除外,其中n的值约为逻辑处理器的 5/16。 |
| 设置并行标记线程的数量。设置 |
| 设置触发标记周期的Java堆占用阈值。默认占用率为整个 Java 堆的 45%。 |
| 设置要包含在混合垃圾收集周期中的旧区域的占用阈值。默认占用率为 85%。脚参考1 这是一个实验性的标志。有关示例,请参阅如何解锁实验 VM 标志。此设置取代了该 |
| 设置您愿意浪费的堆的百分比。当可回收百分比小于堆浪费百分比时,Java HotSpot VM 不会启动混合垃圾收集周期。默认值为 5%。脚参考1 |
| 设置标记周期后混合垃圾收集的目标数量,以收集最多包含 |
| 设置混合垃圾收集周期期间要收集的旧区域数量的上限。默认值为 Java 堆的 10%。脚参考1 |
| 设置保留空闲内存的百分比,以降低空间溢出的风险。默认值为 10%。当您增加或减少百分比时,请确保将 Java 堆总量调整相同的量。脚参考1 |
脚注1此设置在 Java HotSpot VM build 23 或更早版本中不可用。
官方文档:https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/g1_gc_tuning.html