熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

JVM調優的幾種策略

2022-06-13   來源: Java核心技術 
    JVM參數調優是一個很頭痛的問題可能和應用有關系別人說可以的對自己不一定管用下面是本人一些JVM調優的實踐經驗希望對讀者能有幫助環境LinuxASresinJDKCPUG內存dell服務器
   
    JVM調優
   
    一JVM調優之串行垃圾回收
   
    也就是默認配置完成萬request用時JVM參數配置如下
   
    $JAVA_ARGS=Dresinhome=$SERVER_ROOTserver
   
    XmsMXmxMXmnM
   
    XX:PermSize=MXX:MaxPermSize=M
   
    XX:MaxTenuringThreshold=XX:GCTimeRatio=
   
    XnoclassgcXloggc:log/gclog
   
    XX:+PrintGCDetailsXX:+PrintGCTimeStamps;
   
    這種配置一般在resin啟動小時內似乎沒有大問題網站可以正常訪問但查看日志發現在接近小時時FullGC執行越來越頻繁大約每隔分鐘就有一次FullGC每次FullGC系統會停頓秒左右作為一個網站來說用戶等待秒恐怕太長了所以這種方式有待改善MaxTenuringThreshold=表示一個對象如果在救助空間移動次還沒有被回收就放入年老代GCTimeRatio=表示java可以用%的時間來做垃圾回收/(+)=/=%
   
    二JVM調優之並行回收
   
    完成萬request用時配置如下
   
    $JAVA_ARGS=Dresinhome=$SERVER_ROOTserverXmxM
   
    XmsMXmnMXX:PermSize=MXX:MaxPermSize=M
   
    XnoclassgcXloggc:log/gclogXX:+PrintGCDetails
   
    XX:+PrintGCTimeStampsXX:+UseParallelGCXX:ParallelGCThreads=
   
    XX:+UseParallelOldGCXX:MaxGCPauseMillis=
   
    XX:+UseAdaptiveSizePolicyXX:MaxTenuringThreshold=
   
    XX:GCTimeRatio=;
   
    並行回收我嘗試過多種組合配置似乎都沒什麼用resin啟動小時左右就會停頓時間超過也有可能是參數設置不夠好的原因MaxGCPauseMillis表示GC最大停頓時間在resin剛啟動還沒有執行FullGC時系統是正常的但一旦執行FullGCMaxGCPauseMillis根本沒有用停頓時間可能超過之後會發生什麼我也不再關心了趕緊重啟resin嘗試其他回收策略
   
    三JVM調優之並發回收
   
    完成萬request用時比並行回收差不多快一倍是默認回收策略性能的配置如下
   
    $JAVA_ARGS=Dresinhome=$SERVER_ROOTserver
   
    XmsMXmxMXmnMXX:PermSize=M
   
    XX:MaxPermSize=MXX:+UseConcMarkSweepGC
   
    XX:MaxTenuringThreshold=XX:GCTimeRatio=
   
    XnoclassgcXloggc:log/gclogXX:+PrintGCDetails
   
    XX:+PrintGCTimeStampsXX:+UseCMSCompactAtFullCollection
   
    XX:CMSFullGCsBeforeCompaction=;
   
    這個配置雖然不會出現秒連不上的情況但系統重啟個小時左右每隔幾分鐘就會有秒連不上的情況查看gclog發現在執行ParNewGC時有個promotionfailed錯誤從而轉向執行FullGC造成系統停頓而且會很頻繁每隔幾分鐘就有一次所以還得改善UseCMSCompactAtFullCollection是表是執行FullGC後對內存進行整理壓縮免得產生內存碎片CMSFullGCsBeforeCompaction=N表示執行N次FullGC後執行內存壓縮
   
    四JVM調優之增量回收
   
    完成萬request用時太慢了配置如下
   
    $JAVA_ARGS=Dresinhome=$SERVER_ROOTserver
   
    XmsMXmxMXmnMXX:PermSize=M
   
    XX:MaxPermSize=MXX:MaxTenuringThreshold=
   
    XX:GCTimeRatio=XnoclassgcXloggc:log/gclog
   
    XX:+PrintGCDetailsXX:+PrintGCTimeStampsXincgc;
   
    似乎回收得也不太干淨而且也對性能有較大影響不值得試
   
    五JVM調優之並發回收的ICMS模式
   
    和增量回收差不多完成萬request用時配置如下
   
    $JAVA_ARGS=Dresinhome=$SERVER_ROOTserver
   
    XmsMXmxMXmnMXX:PermSize=M
   
    XX:MaxPermSize=MXX:MaxTenuringThreshold=
   
    XX:GCTimeRatio=XnoclassgcXloggc:log/gclog
   
    XX:+PrintGCDetailsXX:+PrintGCTimeStamps
   
    XX:+UseConcMarkSweepGCXX:+CMSIncrementalMode
   
    XX:+CMSIncrementalPacing
   
    XX:CMSIncrementalDutyCycleMin=
   
    XX:CMSIncrementalDutyCycle=XX:TraceClassUnloading;
   
    采用了sun推薦的參數回收效果不好照樣有停頓數小時之內就會頻繁出現停頓什麼sun推薦的參數照樣不好使
   
    六JVM調優之遞增式低暫停收集器
   
    又叫什麼火車式回收完成萬request用時配置如下
   
    $JAVA_ARGS=Dresinhome=$SERVER_ROOTserver
   
    XmsMXmxMXmnMXX:PermSize=M
   
    XX:MaxPermSize=MXX:MaxTenuringThreshold=
   
    XX:GCTimeRatio=XnoclassgcXloggc:log/gclog
   
    XX:+PrintGCDetailsXX:+PrintGCTimeStampsXX:+UseTrainGC;
   
    該配置效果也不好影響性能所以沒試
   
    七相比之下還是並發回收比較好性能比較高只要能解決ParNewGC(並行回收年輕代)時的promotionfailed錯誤就一切好辦了查了很多文章發現引起promotionfailed錯誤的原因是CMS來不及回收(CMS默認在年老代占到%左右才會執行)年老代又沒有足夠的空間供GC把一些活的對象從年輕代移到年老代所以執行FullGCCMSInitiatingOccupancyFraction=表示年老代占到約%時就開始執行CMS這樣就不會出現FullGC了SoftRefLRUPolicyMSPerMB這個參數也是我認為比較有用的官方解釋是softlyreachableobjectswillremainaliveforsomeamountoftimeafterthelasttimetheywerereferencedThedefaultvalueisonesecondoflifetimeperfreemegabyteintheheap我覺得沒必要等所以設置成配置如下
   
    $JAVA_ARGS=Dresinhome=$SERVER_ROOTserverXmsM
   
    XmxMXmnMXX:PermSize=MXX:MaxPermSize=M
   
    XX:SurvivorRatio=XX:MaxTenuringThreshold=
   
    XX:GCTimeRatio=XnoclassgcXX:+DisableExplicitGC
   
    XX:+UseParNewGCXX:+UseConcMarkSweepGC
   
    XX:+CMSPermGenSweepingEnabled
   
    XX:+UseCMSCompactAtFullCollection
   
    XX:CMSFullGCsBeforeCompaction=
   
    XX:+CMSClassUnloadingEnabledXX:CMSParallelRemarkEnabled
   
    XX:CMSInitiatingOccupancyFraction=
   
    XX:SoftRefLRUPolicyMSPerMB=XX:+PrintClassHistogram
   
    XX:+PrintGCDetailsXX:+PrintGCTimeStamps
   
    XX:+PrintGCApplicationConcurrentTime
   
    XX:+PrintGCApplicationStoppedTime
   
    Xloggc:log/gclog;
   
    上面這個配置內存上升的很慢小時之內幾乎沒有停頓現象最長的只停滯了sParNewGC每秒左右才執行一次每次回收約看來問題應該暫時解決了
From:http://tw.wingwit.com/Article/program/Java/hx/201311/25923.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.