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次

聚合報告對比

  • 調優前

輸入圖片說明

  • 調優後

輸入圖片說明

相關文章
相關標籤/搜索