JVM垃圾收集调优案例-xwiki吞吐量调优

简介

经过压力测试查看xwiki的gc状况,统计分析gc日志,在不改变总内存使用的状况下作出合理调整,经过压力测试聚合报告对比调优效果。web

步骤

  1. 运行程序,增长打印GC日志的参数;
  2. 使用badboy + jmeter对web程序的单个页面(首页)进行压力测试,压力测试参数为10线程,每线程执行100次测试;
  3. 使用jstatd + jvisualVM实时查看或gcviewer分析GC日志;
  4. 根据分析结果,调整JVM参数;
  5. 分析结果达到预期,结束,不然继续执行1~4。

工具

  • Badboy - 录制jmeter脚本
  • Jmeter - 压力测试
  • Jstatd - 提供远程使用jvisualVM实时看gc状况服务
  • jvisualVM - 查看gc状况
  • Gcviewer - 分析GC日志

测试环境

虚拟机 CPU 8核,内存 8G 操做系统 CentOS6.5 JDK: 1.7jvm

第一轮:使用默认参数

运行web工具

JVM参数

-Xmx512m -XX:MaxPermSize=196m -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:$LOGSDIR/xwiki.gc -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=1 -XX:GCLogFileSize=512M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${LOGSDIR}测试

总内存:512 + 196 = 708M操作系统

结果

jstatd + jvisualVM实时:线程

输入图片说明

GCViwer:日志

输入图片说明

输入图片说明

输入图片说明

聚合报告

输入图片说明

统计分析GC日志: awk '{print $5,$6}' target.0 | awk -F'(' '{print $1,$2}' | awk '{print $1,$3}' | awk -F'->' '{print $1,$2,$3}' | awk -F'K' '{print $1,$2,$3,$4}' | awk '{print ($3-$4)/$1}' | awk '{sum+=$1} END{print sum/NR}' 平均年轻代的回收率为72%, 最差的回收率也基本大于65% 平均每次young GC 堆回收的内存空间为95M, 溢出到老年代的空间为16M 分析full gc每次的存活对象空间大概在170M左右对象

第二轮 - 调整jvm参数减小Full GC

调整

设置老年代大小为170M × 1.5 = 255M 新生代设置为170M × 2 = 340M图片

根据回收率计算Eden和Survivor的比例 设eden空间大小为E 设survivor大小为S 则有: E+2*S=340; S/S+E=0.35; -- 假设年轻代回收率为65% 计算得,E:S=1.8:1 则取值2:1内存

eden:survivor = 2:1

堆空间255+340=595M 永久代 708 - 595 = 113M

JVM参数

-Xmx595M -Xms595M -XX:NewSize=340M -XX:MaxNewSize=340M -XX:SurvivorRatio=2 -XX:PermSize=113M -XX:MaxPermSize=113M -XX:-UseAdaptiveSizePolicy -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:$LOGSDIR/xwiki.gc -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=1 -XX:GCLogFileSize=512M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${LOGSDIR}

结果

jvisualVM:

输入图片说明 gcviewer:

输入图片说明

输入图片说明

输入图片说明

聚合报告

输入图片说明

再次对比测试

10线程,每线程1000次

聚合报告对比

  • 调优前

输入图片说明

  • 调优后

输入图片说明

相关文章
相关标签/搜索