JVM調(diào)優(yōu)的幾種策略分別是什么

這期內(nèi)容當中小編將會給大家?guī)碛嘘P(guān)JVM調(diào)優(yōu)的幾種策略分別是什么,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

成都創(chuàng)新互聯(lián)公司2013年至今,先為鶴慶等服務(wù)建站,鶴慶等地企業(yè),進行企業(yè)商務(wù)咨詢服務(wù)。為鶴慶企業(yè)網(wǎng)站制作PC+手機+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。

JVM參數(shù)調(diào)優(yōu)是一個很頭痛的問題,可能和應(yīng)用有關(guān)系,別人說可以的對自己不一定管用。下面是本人一些JVM調(diào)優(yōu)的實踐經(jīng)驗,希望對讀者能有幫助,環(huán)境LinuxAS4,resin2.1.17,JDK6.0,2CPU,4G內(nèi)存,dell2950服務(wù)器。

JVM調(diào)優(yōu)

一:JVM調(diào)優(yōu)之串行垃圾回收

也就是默認配置,完成10萬request用時153秒。JVM參數(shù)配置如下:

$JAVA_ARGS.="-Dresin.home=$SERVER_ROOT-server   -Xms2048M-Xmx2048M-Xmn512M-XX:PermSize=256M-XX:MaxPermSize=256M  -XX:MaxTenuringThreshold=7-XX:GCTimeRatio=19  -Xnoclassgc-Xloggc:log/gc.log-XX:+PrintGCDetails-XX:+PrintGCTimeStamps";

這種配置一般在resin啟動24小時內(nèi)似乎沒有大問題,網(wǎng)站可以正常訪問,但查看日志發(fā)現(xiàn),在接近24小時時,F(xiàn)ullGC執(zhí)行越來越頻繁,大約每隔3分鐘就有一次FullGC,每次FullGC系統(tǒng)會停頓6秒左右,作為一個網(wǎng)站來說,用戶等待6秒恐怕太長了,所以這種方式有待改善。MaxTenuringThreshold=7表示一個對象如果在救助空間移動7次還沒有被回收就放入年老代,GCTimeRatio=19表示java可以用5%的時間來做垃圾回收,1/(1+19)=1/20=5%。

二:JVM調(diào)優(yōu)之并行回收

完成10萬request用時117秒,配置如下:

$JAVA_ARGS.="-Dresin.home=$SERVER_ROOT-server-Xmx2048M  -Xms2048M-Xmn512M-XX:PermSize=256M-XX:MaxPermSize=256M -Xnoclassgc-Xloggc:log/gc.log-XX:+PrintGCDetails  -XX:+PrintGCTimeStamps-XX:+UseParallelGC-XX:ParallelGCThreads=20 -XX:+UseParallelOldGC-XX:MaxGCPauseMillis=500 -XX:+UseAdaptiveSizePolicy-XX:MaxTenuringThreshold=7 -XX:GCTimeRatio=19";

并行回收我嘗試過多種組合配置,似乎都沒什么用,resin啟動3小時左右就會停頓,時間超過10秒。也有可能是參數(shù)設(shè)置不夠好的原因,MaxGCPauseMillis表示GC***停頓時間,在resin剛啟動還沒有執(zhí)行FullGC時系統(tǒng)是正常的,但一旦執(zhí)行FullGC,MaxGCPauseMillis根本沒有用,停頓時間可能超過20秒,之后會發(fā)生什么我也不再關(guān)心了,趕緊重啟resin,嘗試其他回收策略。

三:JVM調(diào)優(yōu)之并發(fā)回收

完成10萬request用時60秒,比并行回收差不多快一倍,是默認回收策略性能的2.5倍,配置如下:

$JAVA_ARGS.="-Dresin.home=$SERVER_ROOT-server  -Xms2048M-Xmx2048M-Xmn512M-XX:PermSize=256M -XX:MaxPermSize=256M-XX:+UseConcMarkSweepGC  -XX:MaxTenuringThreshold=7-XX:GCTimeRatio=19 -Xnoclassgc-Xloggc:log/gc.log-XX:+PrintGCDetails  -XX:+PrintGCTimeStamps-XX:+UseCMSCompactAtFullCollection  -XX:CMSFullGCsBeforeCompaction=0";

這個配置雖然不會出現(xiàn)10秒連不上的情況,但系統(tǒng)重啟3個小時左右,每隔幾分鐘就會有5秒連不上的情況,查看gc.log,發(fā)現(xiàn)在執(zhí)行ParNewGC時有個promotionfailed錯誤,從而轉(zhuǎn)向執(zhí)行FullGC,造成系統(tǒng)停頓,而且會很頻繁,每隔幾分鐘就有一次,所以還得改善。UseCMSCompactAtFullCollection是表是執(zhí)行FullGC后對內(nèi)存進行整理壓縮,免得產(chǎn)生內(nèi)存碎片,CMSFullGCsBeforeCompaction=N表示執(zhí)行N次FullGC后執(zhí)行內(nèi)存壓縮。

四:JVM調(diào)優(yōu)之增量回收

完成10萬request用時171秒,太慢了,配置如下:

$JAVA_ARGS.="-Dresin.home=$SERVER_ROOT-server  -Xms2048M-Xmx2048M-Xmn512M-XX:PermSize=256M -XX:MaxPermSize=256M-XX:MaxTenuringThreshold=7 -XX:GCTimeRatio=19-Xnoclassgc-Xloggc:log/gc.log  -XX:+PrintGCDetails-XX:+PrintGCTimeStamps-Xincgc";

似乎回收得也不太干凈,而且也對性能有較大影響,不值得試。

五:JVM調(diào)優(yōu)之并發(fā)回收的I-CMS模式

和增量回收差不多,完成10萬request用時170秒。配置如下:

$JAVA_ARGS.="-Dresin.home=$SERVER_ROOT-server  -Xms2048M-Xmx2048M-Xmn512M-XX:PermSize=256M -XX:MaxPermSize=256M-XX:MaxTenuringThreshold=7 -XX:GCTimeRatio=19-Xnoclassgc-Xloggc:log/gc.log  -XX:+PrintGCDetails-XX:+PrintGCTimeStamps  -XX:+UseConcMarkSweepGC-XX:+CMSIncrementalMode  -XX:+CMSIncrementalPacing  -XX:CMSIncrementalDutyCycleMin=0 -XX:CMSIncrementalDutyCycle=10-XX:-TraceClassUnloading";

采用了sun推薦的參數(shù),回收效果不好,照樣有停頓,數(shù)小時之內(nèi)就會頻繁出現(xiàn)停頓,什么sun推薦的參數(shù),照樣不好使。

六:JVM調(diào)優(yōu)之遞增式低暫停收集器

又叫什么火車式回收,完成10萬request用時153秒,配置如下:

$JAVA_ARGS.="-Dresin.home=$SERVER_ROOT-server  -Xms2048M-Xmx2048M-Xmn512M-XX:PermSize=256M -XX:MaxPermSize=256M-XX:MaxTenuringThreshold=7 -XX:GCTimeRatio=19-Xnoclassgc-Xloggc:log/gc.log  -XX:+PrintGCDetails-XX:+PrintGCTimeStamps-XX:+UseTrainGC";

該配置效果也不好,影響性能,所以沒試。

七:相比之下,還是并發(fā)回收比較好,性能比較高,只要能解決ParNewGC(并行回收年輕代)時的promotionfailed錯誤就一切好辦了,查了很多文章,發(fā)現(xiàn)引起promotionfailed錯誤的原因是CMS來不及回收(CMS默認在年老代占到90%左右才會執(zhí)行),年老代又沒有足夠的空間供GC把一些活的對象從年輕代移到年老代,所以執(zhí)行FullGC。CMSInitiatingOccupancyFraction=70表示年老代占到約70%時就開始執(zhí)行CMS,這樣就不會出現(xiàn)FullGC了。SoftRefLRUPolicyMSPerMB這個參數(shù)也是我認為比較有用的,官方解釋是softlyreachableobjectswillremainaliveforsomeamountoftimeafterthelasttime
theywerereferenced.Thedefaultvalueisonesecondo
flifetimeperfreemegabyteintheheap,我覺得沒必要等1秒,所以設(shè)置成0。配置如下

$JAVA_ARGS.="-Dresin.home=$SERVER_ROOT-server-Xms2048M  -Xmx2048M-Xmn512M-XX:PermSize=256M-XX:MaxPermSize=256M -XX:SurvivorRatio=8-XX:MaxTenuringThreshold=7 -XX:GCTimeRatio=19-Xnoclassgc-XX:+DisableExplicitGC  -XX:+UseParNewGC-XX:+UseConcMarkSweepGC  -XX:+CMSPermGenSweepingEnabled  -XX:+UseCMSCompactAtFullCollection  -XX:CMSFullGCsBeforeCompaction=0 -XX:+CMSClassUnloadingEnabled-XX:-CMSParallelRemarkEnabled  -XX:CMSInitiatingOccupancyFraction=70 -XX:SoftRefLRUPolicyMSPerMB=0-XX:+PrintClassHistogram  -XX:+PrintGCDetails-XX:+PrintGCTimeStamps  -XX:+PrintGCApplicationConcurrentTime  -XX:+PrintGCApplicationStoppedTime  -Xloggc:log/gc.log";

上面這個配置內(nèi)存上升的很慢,24小時之內(nèi)幾乎沒有停頓現(xiàn)象,最長的只停滯了0.8s,ParNewGC每30秒左右才執(zhí)行一次,每次回收約0.2秒,看來問題應(yīng)該暫時解決了。

參數(shù)不明白的可以上網(wǎng)查,本人認為比較重要的幾個參數(shù)是:

-Xms-Xmx-XmnMaxTenuringThresholdGCTimeRatioUse

ConcMarkSweepGCCMSInitiatingOccupancyFractionSoftRefLRUPolicyMSPerMB

eclipse中配置JVM參數(shù):-Xmx1024M-Xms1000M-server-XX:PermSize=64M-XX:MaxPermSize=128m

上述就是小編為大家分享的JVM調(diào)優(yōu)的幾種策略分別是什么了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

文章標題:JVM調(diào)優(yōu)的幾種策略分別是什么
轉(zhuǎn)載源于:http://bm7419.com/article40/gegsho.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站設(shè)計、企業(yè)建站、網(wǎng)站維護、App設(shè)計、網(wǎng)站營銷、做網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站