自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

JVM參數(shù)調(diào)優(yōu)八大技巧

開發(fā) 后端
要想配置好JVM參數(shù),需要對年輕代、年老代、救助空間和永久代有一定了解,還要了解jvm內(nèi)存管理邏輯,最終還要根據(jù)自己的應(yīng)用來做調(diào)整。

這里和大家分享一下JVM參數(shù)調(diào)優(yōu)的八條經(jīng)驗,JVM參數(shù)調(diào)優(yōu),這是很頭痛的問題,設(shè)置的不好,JVM不斷執(zhí)行FullGC,導(dǎo)致整個系統(tǒng)變得很慢,網(wǎng)站停滯時間能達(dá)10秒以上,相信通過本文的學(xué)習(xí)你對JVM參數(shù)調(diào)優(yōu)有新的認(rèn)識。

實例講解JVM參數(shù)調(diào)優(yōu)的八條經(jīng)驗

本文將介紹JVM參數(shù)調(diào)優(yōu),這是很頭痛的問題,設(shè)置的不好,JVM不斷執(zhí)行FullGC,導(dǎo)致整個系統(tǒng)變得很慢,網(wǎng)站停滯時間能達(dá)10秒以上,這種情況如果沒隔幾分鐘就來一次,自己都受不了。這種停滯在測試的時候看不出來,只有網(wǎng)站pv達(dá)到數(shù)十萬/天的時候問題就暴露出來了。

要想配置好JVM參數(shù),需要對年輕代、年老代、救助空間和***代有一定了解,還要了解jvm內(nèi)存管理邏輯,最終還要根據(jù)自己的應(yīng)用來做調(diào)整。關(guān)于JVM參數(shù)上網(wǎng)一搜就能搜出一大把,也有很多提供實踐的例子,我也按照各種例子測試過,最終還是會出現(xiàn)問題。

經(jīng)過幾個月的實踐改善,我就網(wǎng)站(要求無停滯時間)的jvm參數(shù)調(diào)優(yōu)給出以下幾條經(jīng)驗。

1:建議用64位操作系統(tǒng),Linux下64位的jdk比32位jdk要慢一些,但是吃得內(nèi)存更多,吞吐量更大。

2:XMX和XMS設(shè)置一樣大,MaxPermSize和MinPermSize設(shè)置一樣大,這樣可以減輕伸縮堆大小帶來的壓力。

3:調(diào)試的時候設(shè)置一些打印JVM參數(shù),如-XX:+PrintClassHistogram-XX:+PrintGCDetails-XX:+PrintGCTimeStamps-XX:+PrintHeapAtGC-Xloggc:log/gc.log,這樣可以從gc.log里看出一些端倪出來。

4:系統(tǒng)停頓的時候可能是GC的問題也可能是程序的問題,多用jmap和jstack查看,或者killall-3java,然后查看java控制臺日志,能看出很多問題。有一次,網(wǎng)站突然很慢,jstack一看,原來是自己寫的URLConnection連接太多沒有釋放,改一下程序就OK了。

5:仔細(xì)了解自己的應(yīng)用,如果用了緩存,那么年老代應(yīng)該大一些,緩存的HashMap不應(yīng)該無限制長,建議采用LRU算法的Map做緩存,LRUMap的***長度也要根據(jù)實際情況設(shè)定。

6:垃圾回收時promotionfailed是個很頭痛的問題,一般可能是兩種原因產(chǎn)生,***個原因是救助空間不夠,救助空間里的對象還不應(yīng)該被移動到年老代,但年輕代又有很多對象需要放入救助空間;第二個原因是年老代沒有足夠的空間接納來自年輕代的對象;這兩種情況都會轉(zhuǎn)向FullGC,網(wǎng)站停頓時間較長。***個原因我的最終解決辦法是去掉救助空間,設(shè)置-XX:SurvivorRatio=65536-XX:MaxTenuringThreshold=0即可,第二個原因我的解決辦法是設(shè)置CMSInitiatingOccupancyFraction為某個值(假設(shè)70),這樣年老代空間到70%時就開始執(zhí)行CMS,年老代有足夠的空間接納來自年輕代的對象。

7:不管怎樣,***代還是會逐漸變滿,所以隔三差五重起java服務(wù)器是必要的,我每天都自動重起。

8:采用并發(fā)回收時,年輕代小一點,年老代要大,因為年老大用的是并發(fā)回收,即使時間長點也不會影響其他程序繼續(xù)運行,網(wǎng)站不會停頓。

我的最終配置如下(系統(tǒng)8G內(nèi)存),每天幾百萬pv一點問題都沒有,網(wǎng)站沒有停頓,2009年網(wǎng)站沒有因為內(nèi)存問題down過機。

  1. $JAVA_ARGS.="-Dresin.home=$SERVER_ROOT  
  2. -server-Xms6000M-Xmx6000M-Xmn500M  
  3. -XX:PermSize=500M-XX:MaxPermSize=500M 
  4. -XX:SurvivorRatio=65536 
  5. -XX:MaxTenuringThreshold=0 
  6. -Xnoclassgc  
  7. -XX:+DisableExplicitGC  
  8. XX:+UseParNewGC-XX:+UseConcMarkSweepGC  
  9. -XX:+UseCMSCompactAtFullCollection  
  10. -XX:CMSFullGCsBeforeCompaction=0 
  11. -XX:+CMSClassUnloadingEnabled  
  12. -XX:-CMSParallelRemarkEnabled  
  13. -XX:CMSInitiatingOccupancyFraction=90 
  14. -XX:SoftRefLRUPolicyMSPerMB=0-XX:+PrintClassHistogram  
  15. -XX:+PrintGCDetails-XX:+PrintGCTimeStamps-XX:+PrintHeapAtGC  
  16. -Xloggc:log/gc.log";  

說明一下,-XX:SurvivorRatio=65536,-XX:MaxTenuringThreshold=0就是去掉了救助空間;

-Xnoclassgc禁用類垃圾回收,性能會高一點;

-XX:+DisableExplicitGC禁止System.gc(),免得程序員誤調(diào)用gc方法影響性能;

-XX:+UseParNewGC,對年輕代采用多線程并行回收,這樣收得快;

帶CMS參數(shù)的都是和并發(fā)回收相關(guān)的,不明白的可以上網(wǎng)搜索;

CMSInitiatingOccupancyFraction,這個參數(shù)設(shè)置有很大技巧,基本上滿足(Xmx-Xmn)*(100-CMSInitiatingOccupancyFraction)/100>=Xmn就不會出現(xiàn)promotionfailed。在我的應(yīng)用中Xmx是6000,Xmn是500,那么Xmx-Xmn是5500兆,也就是年老代有5500兆,CMSInitiatingOccupancyFraction=90說明年老代到90%滿的時候開始執(zhí)行對年老代的并發(fā)垃圾回收(CMS),這時還剩10%的空間是5500*10%=550兆,所以即使Xmn(也就是年輕代共500兆)里所有對象都搬到年老代里,550兆的空間也足夠了,所以只要滿足上面的公式,就不會出現(xiàn)垃圾回收時的promotionfailed;

SoftRefLRUPolicyMSPerMB這個參數(shù)我認(rèn)為可能有點用,官方解釋是softlyreachableobjectswillremainaliveforsomeamountoftimeafterthelasttimetheywerereferenced.

Thedefaultvalueisonesecondoflifetimeperfreemegabyteintheheap,我覺得沒必要等1秒;

網(wǎng)上其他介紹JVM參數(shù)的也比較多,估計其中大部分是沒有遇到promotionfailed,或者訪問量太小沒有機會遇到,(Xmx-Xmn)*(100-CMSInitiatingOccupancyFraction)/100>=Xmn這個公式絕對是原創(chuàng),真遇到promotionfailed了,還得這么處理。
 

【編輯推薦】

  1. 詳解Tomcat配置JVM參數(shù)步驟
  2. 實例講解JVM參數(shù)調(diào)優(yōu)的八條經(jīng)驗
  3. JVM.dll裝載過程與源代碼分析
  4. 巧解使Eclipse崩潰的JVM terminated問題
  5. 解決JVM Terminated.ExitCode=-1問題行之有效的方法

 

 

責(zé)任編輯:佚名 來源: 豆瓣網(wǎng)
相關(guān)推薦

2010-09-25 13:05:07

JVM參數(shù)

2010-09-26 09:08:17

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

2009-07-08 11:11:23

JVM

2010-03-04 10:56:52

JVM參數(shù)

2023-11-10 11:23:20

JVM內(nèi)存

2010-09-25 15:52:27

JVM內(nèi)存JVM

2010-08-27 17:48:38

CSS

2012-01-10 14:35:08

JavaJVM

2022-04-25 13:11:14

Python編程技巧

2017-07-21 08:55:13

TomcatJVM容器

2023-11-11 19:07:23

JVMJava

2020-12-30 15:06:39

開發(fā)技能代碼

2022-11-30 08:17:41

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

2014-03-24 11:17:27

2021-09-06 11:02:17

JVM架構(gòu)調(diào)優(yōu)

2021-03-17 11:35:11

JVM代碼Java

2012-01-10 15:13:56

JavaJVM

2010-09-26 13:39:46

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

2009-05-22 18:37:30

數(shù)據(jù)中心虛擬化服務(wù)器

2010-08-23 16:31:33

CSS
點贊
收藏

51CTO技術(shù)棧公眾號