JVM之性能调优
优化指标
吞吐量
吞吐量=CPU运行用户代码时间/(GC时间+运行用户代码时间)
延迟
- 平均延时(YGC持续时间);
- 平均延时频率(YGC频率);
- 最差延时(FGC持续时间);
- 最差延时频率(FGC频率);
内存占用
基础准备
GC日志
GC日志是性能调优及问题排查的基础,常用参数及格式如下所示:
OOM内存镜像
- -XX:+HeapDumpOnOutOfMemoryError 发生OOM时dump堆内存
- -XX:HeapDumpPath=/home/admin/logs/java.hprof
参数调优
禁止动态调整
原理: 对于关注吞吐量和延迟的Java应用,应将固定堆(新生代和老年代)和永久代的大小,因为堆的动态调整(扩展或缩减)会触发FGC,降低系统吞吐量,增加响应时间。
操作:
- 固定堆大小,将-Xms和-Xmn设置相同;
- 固定新生代大小,将-XX:NewSize和-XX:MaxNewSize设置相同,或者使用-Xmn;
- 固定永久代大小,将-XX:PermSize和-XX:MaxPermSize设置相同;
堆大小预估
- 设置堆大小初始值(如60%),开始压测;
- 观察GC日志,如果出现OOM,则适当增加堆大小,继续压测;
- 当没有OOM,系统运行稳定后,根据如下法则设置堆的大小;
新生代大小调整
原理:增加新生代空间,YGC频率降低,持续时间变长;减小新生代空间,YGC频率变高,持续时间变短;
注意:调整新生代大小时应尽量保持老年代空间大小恒定;
老年代大小调整
如果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一次)