JVM之性能调优

优化指标

吞吐量

  吞吐量=CPU运行用户代码时间/(GC时间+运行用户代码时间)

延迟

  1. 平均延时(YGC持续时间);
  2. 平均延时频率(YGC频率);
  3. 最差延时(FGC持续时间);
  4. 最差延时频率(FGC频率);

内存占用

基础准备

GC日志

GC日志是性能调优及问题排查的基础,常用参数及格式如下所示:
JVM之性能调优

JVM之性能调优

OOM内存镜像

  • -XX:+HeapDumpOnOutOfMemoryError 发生OOM时dump堆内存
  • -XX:HeapDumpPath=/home/admin/logs/java.hprof

参数调优

禁止动态调整

原理: 对于关注吞吐量和延迟的Java应用,应将固定堆(新生代和老年代)和永久代的大小,因为堆的动态调整(扩展或缩减)会触发FGC,降低系统吞吐量,增加响应时间。
操作:

  1. 固定堆大小,将-Xms和-Xmn设置相同;
  2. 固定新生代大小,将-XX:NewSize和-XX:MaxNewSize设置相同,或者使用-Xmn;
  3. 固定永久代大小,将-XX:PermSize和-XX:MaxPermSize设置相同;

堆大小预估

  1. 设置堆大小初始值(如60%),开始压测;
  2. 观察GC日志,如果出现OOM,则适当增加堆大小,继续压测;
  3. 当没有OOM,系统运行稳定后,根据如下法则设置堆的大小;
    JVM之性能调优

新生代大小调整

原理:增加新生代空间,YGC频率降低,持续时间变长;减小新生代空间,YGC频率变高,持续时间变短;
注意:调整新生代大小时应尽量保持老年代空间大小恒定;
JVM之性能调优

老年代大小调整

如果GC日志有FGC,原理同上;否则,需要根据对象的晋升速率估算FGC频率。
FGC周期=老年代可用空间大小/对象晋升速率,对象晋升速率=(YGC后堆占用空间-YGC后新生代占用空间)/YGC周期;

吞吐量调优设置

  • -XX:+UseParallelGC和-XX:+UseParallelOldGC:这两个收集器提供的吞吐量性能是Hotspot提供的诸多垃圾收集器中最好的
  • -XX:ParallelGCThreads=N:配置并行收集器的线程数,即:同时多少个线程一起进行垃圾回收,此值最好配置与处理器数目相等
  • -XX:+UseAdaptiveSizePolicy:设置此选项后,并行收集器会根据对象分配及存活率自动调整Eden和Survivor的比例,最优化对象老化的频率,对于大多数应用已经足够,此值建议使用并行收集器时一直打开

延迟调优设置

  • -XX:+UseParNewGC和-XX:+UseConcMarkSweepGC
  • -XX:CMSInitiatingOccupancyFraction=N(CMS触发时机)
  • -XX:+UseCMSInitiatingOccupancyOnly
  • -XX:+UseCMSCompactAtFullCollection (空间碎片整理)
  • -XX:CMSFullGCsBeforeCompaction=n
  • -XX:+CMSScavengeBeforeRemark(FGC前强制触发YGC一次)