1 資料

2 GC日志打印

  GC調(diào)優(yōu)是個(gè)很實(shí)驗(yàn)很伽利略的活兒,GC日志是先決的數(shù)據(jù)參考和最終驗(yàn)證:

-XX:+PrintGCDetails -XX:+PrintGCTimeStamps(GC發(fā)生的時(shí)間) -XX:+PrintGCApplicationStoppedTime(GC消耗了多少時(shí)間) -XX:+PrintGCApplicationConcurrentTime(GC之間運(yùn)行了多少時(shí)間)

3 收集器選擇

CMS收集器:暫停時(shí)間優(yōu)先

   配置參數(shù):-XX:+UseConcMarkSweepGC
   已默認(rèn)無需配置的參數(shù):-XX:+UseParNewGC(Parallel收集新生代) -XX:+CMSPermGenSweepingEnabled(CMS收集持久代) -XX:UseCMSCompactAtFullCollection(full gc時(shí)壓縮年老代)

   初始效果:1g堆內(nèi)存的新生代約60m,minor gc約5-20毫秒,full gc約130毫秒。

Parallel收集器:吞吐量優(yōu)先

    配置參數(shù): -XX:+UseParallelGC -XX:+UseParallelOldGC(Parallel收集年老代,從JDK6.0開始支持)

    已默認(rèn)無需配置的參數(shù): -XX:+UseAdaptiveSizePolicy(動(dòng)態(tài)調(diào)整新生代大小)

    初始效果:1g堆內(nèi)存的新生代約90-110m(動(dòng)態(tài)調(diào)整),minor gc約5-20毫秒,full gc有無UseParallelOldGC 參數(shù)分別為1.3/1.1秒,差別不大。

    另外-XX:MaxGCPauseMillis=100 設(shè)置minor gc的期望最大時(shí)間,JVM會(huì)以此來調(diào)整新生代的大小,但在此測試環(huán)境中對象死的太快,此參數(shù)作用不大。

4 調(diào)優(yōu)實(shí)戰(zhàn)

      Parallel收集高達(dá)1秒的暫停時(shí)間基本不可忍受,所以選擇CMS收集器。

      在被壓測的Mule 2.0應(yīng)用里,每秒都有大約400M的海量短命對象產(chǎn)生:

  1. 因?yàn)槟J(rèn)60M的新生代太小了,頻繁發(fā)生minor gc,大約0.2秒就進(jìn)行一次。
  2. 因?yàn)镃MS收集器中MaxTenuringThreshold(生代對象撐過過多少次minor gc才進(jìn)入年老代的設(shè)置)默認(rèn)0,存活的臨時(shí)對象不經(jīng)過Survivor區(qū)直接進(jìn)入年老代,不久就占滿年老代發(fā)生full gc。

     對這兩個(gè)參數(shù)的調(diào)優(yōu),既要改善上面兩種情況,又要避免新生代過大,復(fù)制次數(shù)過多造成minor gc的暫停時(shí)間過長。

  1. 使用-Xmn調(diào)到1/3 總內(nèi)存。觀察后設(shè)置-Xmn500M,新生代實(shí)際約460m。(用-XX:NewRatio設(shè)置無效,只能用 -Xmn)。
  2. 添加-XX:+PrintTenuringDistribution 參數(shù)觀察各個(gè)Age的對象總大小,觀察后設(shè)置-XX:MaxTenuringThreshold=5。

      優(yōu)化后,大約1.1秒才發(fā)生一次minor gc,且速度依然保持在15-20ms之間。同時(shí)年老代的增長速度大大減緩,很久才發(fā)生一次full gc,

      參數(shù)定稿:

 -Xms1024m -Xmx1024m -Xmn500m -XX:+UseConcMarkSweepGC   -XX:MaxTenuringThreshold=5  -XX:+ExplicitGCInvokesConcurrent

      最后服務(wù)處理速度從1180 tps 上升到1380 tps,調(diào)整兩個(gè)參數(shù)提升17%的性能還是筆很劃算的買賣。