目录
目标
讲述jvm调优基本策略。
why
jvm调优目标:更高的吞吐量和更小的延迟。
前提
调整JVM配置之前,先从代码层面考虑,改进性能。
情况一:G1
建议选用G1.
G1是不需特殊配置即可提供较好表现性的垃圾回收器。与其改变vm配置,不如从应用本身着手。
fullGC
老年代空间占用过高,无法继续分配足够空间,导致fullGC,且fullGC很耗时。并发标记阶段执行较长,没能启动空间回收阶段。
log中的关键字 Full GC (Allocation Failure)
解决方式
- 增加heap大小,可能增加并发标记的耗时
- 增加执行并发标记的线程数量,-XX:ConcGCThreads
- 提前执行并发标记
- -XX:G1ReservePercent 设置保留空间的比例
- 或者 关闭自适应比例,设置初始占用比例 -XX:-G1UseAdaptiveIHOP -XX:InitiatingHeapOccupancyPercent
调整延迟
分析占用时间
gc log显示占用时间 Times: user=xx sys=xx, real=xx secs
user:VM占用
sys:操作系统占用
real:pause占用
sys占用时间较高
内存空间逐渐增加导致
- 设置相同-Xms -Xmx
- -XX:+AlwaysPreTouch
Linux操作系统THP特性导致,disable the Transparent Huge Pages feature
向磁盘文件输出日志时,后台其他任务占用大部分IO带宽,导致log耗时。
- log输出到独立的磁盘
- 其他存储方式
real占用时间较高
Reference Object Processing Takes Too Long
- G1更新the referents of Reference Objects 更新引用对象指向真实对象
- -XX:ReferencesPerThread=0 每个线程负责的引用对象数量,默认1000,设置为0表示使用允许的最多线程数。控制线程数量 -XX:ParallelGCThreads
- -XX:-ParallelRefProcEnabled
Young-Only Collections Within the Young-Only Phase Take Too Long
- 减小年轻代大小 XX:G1NewSizePercent=x -XX:G1MaxNewSizePercent=x
调整吞吐量
G1目标是在吞吐量和延迟之间达到平衡。为了提升吞吐量,不仅要减少pause时间,还要降低pause的频率。
设置最大延迟时间,仍不满足吞吐量要求,则增加年轻代大小
- -XX:MaxGCPauseMillis
- -XX:G1NewSizePercent -XX:G1MaxNewSizePercent
减少并发工作数量,concurrent remembered set updates 并发记忆集更新会占用较多cpu资源
- 将部分工作移动到gc pause阶段执行,配置提高-XX:G1RSetUpdatingPauseTimePercent,G1处理'并发记忆集更新'的时间 占 总gc时间的百分比
- 完全失效且将所有工作已到gc pause,-XX:-G1UseAdaptiveConcRefinement -XX:G1ConcRefinementGreenZone=2G -XX:G1ConcRefinementThreads=0
启用large page
- -XX:+UseLargePages
- 查看操作系统如何启用large page
提前准备heap空间
- 设置相同-Xms -Xmx
- -XX:+AlwaysPreTouch
设置吞吐量要求
- -XX:GCTimeRatio=<N>
- gc占用时间 / 应用占用时间 = 1 / (1 + N)
- 默认99,即heap占用空间增加前gc占用时间比例为1%
情况二:年轻代并行,年老代cms
更高吞吐量
增大年轻代,可提升吞吐量,但会影响敏捷性、停顿时间
设置吞吐量要求
- -XX:GCTimeRatio=<N>
- gc占用时间 / 应用占用时间 = 1 / (1 + N)
- 默认99,即heap占用空间增加前gc占用时间比例为1%
更小延迟
年轻代设置最大延迟时间
- -XX:MaxGCPauseMillis=<N> 单位毫秒
- 可能影响吞吐量
年老代调整大小
OOM
应用程序导致的问题,进行fix.
内存分配不满足应用足迹,调整heap.
基本操作步骤
使用默认配置,调节Heap大小.
当Heap调节到某值后,对预期结果已无影响时,调整配置:代占用比例、年轻代最大延迟时间、年轻代吞吐量.