JVM-JVM调优

目录

目标

why

情况一:G1

fullGC

调整延迟

调整吞吐量

情况二:年轻代并行,年老代cms

更高吞吐量

更小延迟

OOM

基本操作步骤


目标

讲述jvm调优基本策略。

why

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=
  • gc占用时间 / 应用占用时间 = 1 / (1 + N)
  • 默认99,即heap占用空间增加前gc占用时间比例为1%

 

情况二:年轻代并行,年老代cms 

更高吞吐量

增大年轻代,可提升吞吐量,但会影响敏捷性、停顿时间

设置吞吐量要求

  • -XX:GCTimeRatio=
  • gc占用时间 / 应用占用时间 = 1 / (1 + N)
  • 默认99,即heap占用空间增加前gc占用时间比例为1%

更小延迟

年轻代设置最大延迟时间

  • -XX:MaxGCPauseMillis= 单位毫秒
  • 可能影响吞吐量

年老代调整大小 

OOM

应用程序导致的问题,进行fix.

内存分配不满足应用足迹,调整heap.

基本操作步骤

使用默认配置,调节Heap大小.

当Heap调节到某值后,对预期结果已无影响时,调整配置:代占用比例、年轻代最大延迟时间、年轻代吞吐量.

 

 

 

 

 

你可能感兴趣的:(JAVA,陈海龙的格物之路-JAVA篇)