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

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

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

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

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

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

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

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

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

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

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

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

8:采用并發(fā)回收時(shí),年輕代小一點(diǎn),年老代要大,因?yàn)槟昀洗笥玫氖遣l(fā)回收,即使時(shí)間長(zhǎng)點(diǎn)也不會(huì)影響其他程序繼續(xù)運(yùn)行,網(wǎng)站不會(huì)停頓。

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

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

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

-Xnoclassgc禁用類(lèi)垃圾回收,性能會(huì)高一點(diǎn);

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

-XX:+UseParNewGC,對(duì)年輕代采用多線(xiàn)程并行回收,這樣收得快;

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

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

SoftRefLRUPolicyMSPerMB這個(gè)參數(shù)我認(rèn)為可能有點(diǎn)用,官方解釋是softly reachable objects will remain alive for some amount of time after the last time they were referenced. The default value is one second of lifetime per free megabyte in the heap,我覺(jué)得沒(méi)必要等1秒;

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

【編輯推薦】

  1. 安裝JDK后JRE與JVM聯(lián)系淺談
  2. 監(jiān)視JSP中JVM可用內(nèi)存
  3. JDK、JRE、JVM之間的關(guān)系
  4. Java之父:我們看中的并非Java語(yǔ)言,而是JVM
  5. Java虛擬機(jī)(JVM)中的內(nèi)存設(shè)置詳解
責(zé)任編輯:彭凡 來(lái)源: 豆瓣網(wǎng)
相關(guān)推薦

2010-03-04 10:56:52

JVM參數(shù)

2010-09-17 17:02:24

JVM參數(shù)

2023-11-10 11:23:20

JVM內(nèi)存

2010-09-26 13:48:51

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

2010-09-25 13:05:07

JVM參數(shù)

2011-05-18 15:40:52

MySQL

2019-03-25 20:40:51

微服務(wù)IT開(kāi)發(fā)

2012-01-10 14:35:08

JavaJVM

2021-09-13 07:10:54

Hive查詢(xún)效率

2010-08-30 09:37:48

2017-07-21 08:55:13

TomcatJVM容器

2023-11-11 19:07:23

JVMJava

2021-09-06 11:02:17

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

2021-03-17 11:35:11

JVM代碼Java

2010-09-27 09:23:42

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

2011-05-06 15:34:02

打印機(jī)word

2012-06-01 11:13:58

應(yīng)用推廣八條黃金法則

2022-06-02 08:28:25

Docker代碼運(yùn)維

2010-09-26 09:08:17

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

2010-09-26 13:39:46

JVM調(diào)優(yōu)
點(diǎn)贊
收藏

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