笔记 - GC调优

本文详细介绍Java中四种主要的垃圾回收器:串行、并行、CMS和G1收集器的特点与配置参数,帮助理解如何针对不同应用场景选择最优垃圾回收策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、垃圾回收

-- 选择一个好的垃圾收集器:吞吐量最大时,停顿时间最小
停顿时间: 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 垃圾收集器重要选项的默认值

选项和默认值选项

-XX:G1HeapRegionSize=n

设置 G1 区域的大小。该值是 2 的幂,范围可以从 1 MB 到 32 MB。目标是根据最小 Java 堆大小拥有大约 2048 个区域。

-XX:MaxGCPauseMillis=200

设置所需最大暂停时间的目标值。默认值为 200 毫秒。指定的值不适合您的堆大小。

-XX:G1NewSizePercent=5

设置用作年轻代大小最小值的堆百分比。默认值为 Java 堆的 5%。脚1

这是一个实验性的标志。有关示例,请参阅如何解锁实验 VM 标志。此设置取代了该-XX:DefaultMinNewGenPercent设置。

-XX:G1MaxNewSizePercent=60

设置用作年轻代大小最大值的堆大小百分比。默认值为 Java 堆的 60%。脚参考1

这是一个实验性的标志。有关示例,请参阅如何解锁实验 VM 标志。此设置取代了该-XX:DefaultMaxNewGenPercent设置。

-XX:ParallelGCThreads=n

设置 STW 工作线程的值。将 的值设置n为逻辑处理器的数量。的值n与逻辑处理器的数量相同,最多为 8。

如果逻辑处理器数量超过 8 个,则将n的值设置为逻辑处理器的大约 5/8。这在大多数情况下都适用,但较大的 SPARC 系统除外,其中n的值约为逻辑处理器的 5/16。

-XX:ConcGCThreads=n

设置并行标记线程的数量。设置n为并行垃圾收集线程 (ParallelGCThreads) 数量的大约 1/4。

-XX:InitiatingHeapOccupancyPercent=45

设置触发标记周期的Java堆占用阈值。默认占用率为整个 Java 堆的 45%。

-XX:G1MixedGCLiveThresholdPercent=85

设置要包含在混合垃圾收集周期中的旧区域的占用阈值。默认占用率为 85%。脚参考1

这是一个实验性的标志。有关示例,请参阅如何解锁实验 VM 标志。此设置取代了该-XX:G1OldCSetRegionLiveThresholdPercent设置。

-XX:G1HeapWastePercent=5

设置您愿意浪费的堆的百分比。当可回收百分比小于堆浪费百分比时,Java HotSpot VM 不会启动混合垃圾收集周期。默认值为 5%。脚参考1

-XX:G1MixedGCCountTarget=8

设置标记周期后混合垃圾收集的目标数量,以收集最多包含G1MixedGCLIveThresholdPercent实时数据的旧区域。默认是 8 次混合垃圾回收。混合收集的目标是在这个目标数量之内。脚参考1

-XX:G1OldCSetRegionThresholdPercent=10

设置混合垃圾收集周期期间要收集的旧区域数量的上限。默认值为 Java 堆的 10%。脚参考1

-XX:G1ReservePercent=10

设置保留空闲内存的百分比,以降低空间溢出的风险。默认值为 10%。当您增加或减少百分比时,请确保将 Java 堆总量调整相同的量。脚参考1

脚注1此设置在 Java HotSpot VM build 23 或更早版本中不可用。

官方文档:https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/g1_gc_tuning.html

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值