ããä¸ç®¡æ¯YGCè¿æ¯Full GC,GCè¿ç¨ä¸é½ä¼å¯¹å¯¼è´ç¨åºè¿è¡ä¸ä¸æ,æ£ç¡®çéæ©ä¸åçGCçç¥,è°æ´JVMãGCçåæ°ï¼å¯ä»¥æ大çåå°ç±äºGCå·¥ä½ï¼è导è´çç¨åºè¿è¡ä¸ææ¹é¢çé®é¢ï¼è¿èéå½çæé«Javaç¨åºçå·¥ä½æçãä½æ¯è°æ´GCæ¯ä»¥ä¸ªæ为å¤æçè¿ç¨ï¼ç±äºå个ç¨åºå
·å¤ä¸åçç¹ç¹ï¼å¦ï¼webåGUIç¨åºå°±æå¾å¤§åºå«ï¼Webå¯ä»¥éå½çåé¡¿ï¼ä½GUIåé¡¿æ¯å®¢æ·æ æ³æ¥åçï¼ï¼èä¸ç±äºè·å¨å个æºå¨ä¸çé
ç½®ä¸åï¼ä¸»è¦cup个æ°ï¼å
åä¸åï¼ï¼æ以使ç¨çGCç§ç±»ä¹ä¼ä¸å(å¦ä½éæ©è§GCç§ç±»åå¦ä½éæ©)ãæ¬æå°æ³¨éä»ç»JVMãGCçä¸äºéè¦åæ°ç设置æ¥æé«ç³»ç»çæ§è½ã
ããGCæ§è½æ¹é¢çèè
ãã对äºGCçæ§è½ä¸»è¦æ2个æ¹é¢çææ ï¼ååéthroughputï¼å·¥ä½æ¶é´ä¸ç®gcçæ¶é´å æ»çæ¶é´æ¯ï¼åæåpauseï¼gcåçæ¶app对å¤æ¾ç¤ºçæ æ³ååºï¼ã
ãã1. Total Heap
ããé»è®¤æ
åµä¸ï¼vmä¼å¢å /åå°heap大å°ä»¥ç»´æfree spaceå¨æ´ä¸ªvmä¸å çæ¯ä¾ï¼è¿ä¸ªæ¯ä¾ç±MinHeapFreeRatioåMaxHeapFreeRatioæå®ã
ããä¸è¬èè¨ï¼server端çappä¼æ以ä¸è§åï¼
ãã对vmåé
å°½å¯è½å¤çmemoryï¼
ããå°XmsåXmx设为ä¸æ ·çå¼ãå¦æèææºå¯å¨æ¶è®¾ç½®ä½¿ç¨çå
åæ¯è¾å°ï¼è¿ä¸ªæ¶ååéè¦åå§åå¾å¤å¯¹è±¡ï¼èææºå°±å¿
é¡»éå¤å°å¢å å
åã
ããå¤çå¨æ ¸æ°å¢å ï¼å
åä¹è·çå¢å¤§ã
ãã2. The Young Generation
ããå¦å¤ä¸ä¸ªå¯¹äºappæµç
æ§è¿è¡å½±åçå ç´ æ¯young generationç大å°ãyoung generationè¶å¤§ï¼minor collectionè¶å°ï¼ä½æ¯å¨åºå®heap sizeæ
åµä¸ï¼æ´å¤§çyoung generationå°±æå³çå°çtenured generationï¼å°±æå³çæ´å¤çmajor collection(major collectionä¼å¼åminor collection)ã
ããNewRatioåæ çæ¯youngåtenured generationç大å°æ¯ä¾ãNewSizeåMaxNewSizeåæ çæ¯young generation大å°çä¸éåä¸éï¼å°è¿ä¸¤ä¸ªå¼è®¾ä¸ºä¸æ ·å°±åºå®äºyoung generationç大å°ï¼åXmsåXmx设为ä¸æ ·ï¼ã
ããå¦æå¸æï¼SurvivorRatioä¹å¯ä»¥ä¼åsurvivorç大å°ï¼ä¸è¿è¿å¯¹äºæ§è½çå½±åä¸æ¯å¾å¤§ãSurvivorRatioæ¯edenåsurvior大å°æ¯ä¾ã
ããä¸è¬èè¨ï¼server端çappä¼æ以ä¸è§åï¼
ããé¦å
å³å®è½åé
ç»vmçæ大çheap sizeï¼ç¶å设å®æä½³çyoung generationç大å°ï¼
ããå¦æheap sizeåºå®åï¼å¢å young generationç大å°æå³çåå°tenured generation大å°ã让tenured generationå¨ä»»ä½æ¶åå¤å¤§ï¼è½å¤å®¹çº³ææliveçdataï¼ç10%-20%ç空ä½ï¼ã
ããç»éª&&è§å
ãã年轻代大å°éæ©
ããååºæ¶é´ä¼å
çåºç¨:å°½å¯è½è®¾å¤§,ç´å°æ¥è¿ç³»ç»çæä½ååºæ¶é´éå¶(æ ¹æ®å®é
æ
åµéæ©).å¨æ¤ç§æ
åµä¸,年轻代æ¶éåççé¢çä¹æ¯æå°ç.åæ¶,åå°å°è¾¾å¹´è代ç对象.
ããååéä¼å
çåºç¨:å°½å¯è½ç设置大,å¯è½å°è¾¾Gbitçç¨åº¦.å 为对ååºæ¶é´æ²¡æè¦æ±,åå¾æ¶éå¯ä»¥å¹¶è¡è¿è¡,ä¸è¬éå8CPU以ä¸çåºç¨.
ããé¿å
设置è¿å°.å½æ°ç代设置è¿å°æ¶ä¼å¯¼è´:1.YGC次æ°æ´å é¢ç¹ 2.å¯è½å¯¼è´YGC对象ç´æ¥è¿å
¥æ§ç代,å¦ææ¤æ¶æ§ç代满äº,ä¼è§¦åFGC.
ããå¹´è代大å°éæ©
ããååºæ¶é´ä¼å
çåºç¨:å¹´è代使ç¨å¹¶åæ¶éå¨,æ以å
¶å¤§å°éè¦å°å¿è®¾ç½®,ä¸è¬è¦èè并åä¼è¯çåä¼è¯æç»æ¶é´çä¸äºåæ°.å¦æå 设置å°äº,å¯ä»¥ä¼é æå
åç¢ ç,é«åæ¶é¢ç以ååºç¨æåè使ç¨ä¼ ç»çæ è®°æ¸
é¤æ¹å¼;å¦æå 大äº,åéè¦è¾é¿çæ¶éæ¶é´.æä¼åçæ¹æ¡,ä¸è¬éè¦åè以ä¸æ°æ®è·å¾:
ãã并ååå¾æ¶éä¿¡æ¯ãæä¹
代并åæ¶é次æ°ãä¼ ç»GCä¿¡æ¯ãè±å¨å¹´è½»ä»£åå¹´è代åæ¶ä¸çæ¶é´æ¯ä¾ã
ããååéä¼å
çåºç¨:ä¸è¬ååéä¼å
çåºç¨é½æä¸ä¸ªå¾å¤§ç年轻代åä¸ä¸ªè¾å°çå¹´è代.åå æ¯,è¿æ ·å¯ä»¥å°½å¯è½åæ¶æ大é¨åçæ对象,åå°ä¸æç对象,èå¹´è代尽åæ¾é¿æå活对象.
ããè¾å°å å¼èµ·çç¢çé®é¢
ããå 为年è代ç并åæ¶éå¨ä½¿ç¨æ è®°,æ¸
é¤ç®æ³,æ以ä¸ä¼å¯¹å è¿è¡å缩.å½æ¶éå¨åæ¶æ¶,ä»ä¼æç¸é»ç空é´è¿è¡å并,è¿æ ·å¯ä»¥åé
ç»è¾å¤§ç对象.ä½æ¯,å½å 空é´è¾å°æ¶,è¿è¡ä¸æ®µæ¶é´ä»¥å,å°±ä¼åºç°"ç¢ç",å¦æ并åæ¶éå¨æ¾ä¸å°è¶³å¤ç空é´,é£ä¹å¹¶åæ¶éå¨å°ä¼åæ¢,ç¶å使ç¨ä¼ ç»çæ è®°,æ¸
é¤æ¹å¼è¿è¡åæ¶.å¦æåºç°"ç¢ç",å¯è½éè¦è¿è¡å¦ä¸é
ç½®:
ãã-XX:+UseCMSCompactAtFullCollection:使ç¨å¹¶åæ¶éå¨æ¶,å¼å¯å¯¹å¹´è代çå缩.
ãã-XX:CMSFullGCsBeforeCompaction=0:ä¸é¢é
ç½®å¼å¯çæ
åµä¸,è¿é设置å¤å°æ¬¡Full GCå,对年è代è¿è¡å缩
ããç¨64ä½æä½ç³»ç»ï¼Linuxä¸64ä½çjdkæ¯32ä½jdkè¦æ
¢ä¸äºï¼ä½æ¯åå¾å
åæ´å¤ï¼ååéæ´å¤§
ããXMXåXMS设置ä¸æ ·å¤§ï¼MaxPermSizeåMinPermSize设置ä¸æ ·å¤§ï¼è¿æ ·å¯ä»¥å轻伸缩å 大å°å¸¦æ¥çåå
ãã使ç¨CMSç好å¤æ¯ç¨å°½éå°çæ°ç代ï¼ç»éªå¼æ¯128Mï¼256Mï¼ ç¶åèç代å©ç¨CMS并è¡æ¶éï¼ è¿æ ·è½ä¿è¯ç³»ç»ä½å»¶è¿çååæçã å®é
ä¸cmsçæ¶éåé¡¿æ¶é´é常ççï¼2Gçå
åï¼ å¤§çº¦20ï¼80msçåºç¨ç¨åºåé¡¿æ¶é´
ããç³»ç»åé¡¿çæ¶åå¯è½æ¯GCçé®é¢ä¹å¯è½æ¯ç¨åºçé®é¢ï¼å¤ç¨jmapåjstackæ¥çï¼æè
killall -3 javaï¼ç¶åæ¥çjavaæ§å¶å°æ¥å¿ï¼è½çåºå¾å¤é®é¢ã(ç¸å
³å·¥å
·ç使ç¨æ¹æ³å°å¨åé¢çblogä¸ä»ç»)
ããä»ç»äºè§£èªå·±çåºç¨ï¼å¦æç¨äºç¼åï¼é£ä¹å¹´è代åºè¯¥å¤§ä¸äºï¼ç¼åçHashMapä¸åºè¯¥æ éå¶é¿ï¼å»ºè®®éç¨LRUç®æ³çMapåç¼åï¼LRUMapçæ大é¿åº¦ä¹è¦æ ¹æ®å®é
æ
åµè®¾å®ã
ããéç¨å¹¶ååæ¶æ¶ï¼å¹´è½»ä»£å°ä¸ç¹ï¼å¹´è代è¦å¤§ï¼å 为年è大ç¨çæ¯å¹¶ååæ¶ï¼å³ä½¿æ¶é´é¿ç¹ä¹ä¸ä¼å½±åå
¶ä»ç¨åºç»§ç»è¿è¡ï¼ç½ç«ä¸ä¼åé¡¿
ããJVMåæ°ç设置(ç¹å«æ¯ âXmx âXms âXmn -XX:SurvivorRatio -XX:MaxTenuringThresholdçåæ°ç设置没æä¸ä¸ªåºå®çå
¬å¼ï¼éè¦æ ¹æ®PV oldåºå®é
æ°æ® YGC次æ°çå¤æ¹é¢æ¥è¡¡éã为äºé¿å
promotion faildå¯è½ä¼å¯¼è´xmn设置åå°ï¼ä¹æå³çYGCç次æ°ä¼å¢å¤ï¼å¤ç并å访é®çè½åä¸éçé®é¢ãæ¯ä¸ªåæ°çè°æ´é½éè¦ç»è¿è¯¦ç»çæ§è½æµè¯ï¼æè½æ¾å°ç¹å®åºç¨çæä½³é
ç½®ã
ããpromotion failed:
ããåå¾åæ¶æ¶promotion failedæ¯ä¸ªå¾å¤´ççé®é¢ï¼ä¸è¬å¯è½æ¯ä¸¤ç§åå 产çï¼ç¬¬ä¸ä¸ªåå æ¯æå©ç©ºé´ä¸å¤ï¼æå©ç©ºé´éç对象è¿ä¸åºè¯¥è¢«ç§»å¨å°å¹´è代ï¼ä½å¹´è½»ä»£åæå¾å¤å¯¹è±¡éè¦æ¾å
¥æå©ç©ºé´ï¼ç¬¬äºä¸ªåå æ¯å¹´è代没æ足å¤ç空é´æ¥çº³æ¥èªå¹´è½»ä»£ç对象ï¼è¿ä¸¤ç§æ
åµé½ä¼è½¬åFull GCï¼ç½ç«åé¡¿æ¶é´è¾é¿ã
ãã解å³æ¹æ¹æ¡ä¸ï¼
ãã第ä¸ä¸ªåå æçæç»è§£å³åæ³æ¯å»ææå©ç©ºé´ï¼è®¾ç½®-XX:SurvivorRatio=65536 -XX:MaxTenuringThreshold=0å³å¯ï¼ç¬¬äºä¸ªåå æç解å³åæ³æ¯è®¾ç½®CMSInitiatingOccupancyFraction为æ个å¼ï¼å设70ï¼ï¼è¿æ ·å¹´è代空é´å°70%æ¶å°±å¼å§æ§è¡CMSï¼å¹´è代æ足å¤ç空é´æ¥çº³æ¥èªå¹´è½»ä»£ç对象ã
ãã解å³æ¹æ¡ä¸çæ¹è¿æ¹æ¡ï¼
ããåææ¹è¿äºï¼ä¸é¢æ¹æ³ä¸å¤ªå¥½ï¼å 为没æç¨å°æå©ç©ºé´ï¼æ以年è代容æ满ï¼CMSæ§è¡ä¼æ¯è¾é¢ç¹ãææ¹åäºä¸ä¸ï¼è¿æ¯ç¨æå©ç©ºé´ï¼ä½æ¯ææå©ç©ºé´å 大ï¼è¿æ ·ä¹ä¸ä¼æpromotion failedãå
·ä½æä½ä¸ï¼32ä½Linuxå64ä½Linux好åä¸ä¸æ ·ï¼64ä½ç³»ç»ä¼¼ä¹åªè¦é
ç½®MaxTenuringThresholdåæ°ï¼CMSè¿æ¯ææåã为äºè§£å³æåé®é¢åpromotion failedé®é¢ï¼æåæ设置-XX:SurvivorRatio=1 ï¼å¹¶æMaxTenuringThresholdå»æï¼è¿æ ·å³æ²¡ææååä¸ä¼æpromotoin failedï¼èä¸æ´éè¦çæ¯ï¼å¹´è代åæ°¸ä¹
代ä¸åé常æ
¢ï¼å 为好å¤å¯¹è±¡å°ä¸äºå¹´è代就被åæ¶äºï¼ï¼æ以CMSæ§è¡é¢çé常ä½ï¼å¥½å 个å°æ¶ææ§è¡ä¸æ¬¡ï¼è¿æ ·ï¼æå¡å¨é½ä¸ç¨éå¯äºã
ãã-Xmx4000M -Xms4000M -Xmn600M -XX:PermSize=500M -XX:MaxPermSize=500M -Xss256K -XX:+DisableExplicitGC -XX:SurvivorRatio=1 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=0 -XX:+CMSClassUnloadingEnabled -XX:LargePageSizeInBytes=128M -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=80 -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+PrintClassHistogram -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC -Xloggc:log/gc.log
ãã
ããCMSInitiatingOccupancyFractionå¼ä¸Xmnçå
³ç³»å
¬å¼
ããä¸é¢ä»ç»äºpromontion faild产ççåå æ¯EDEN空é´ä¸è¶³çæ
åµä¸å°EDENä¸From survivorä¸çå活对象åå
¥To survivoråºæ¶,To survivoråºç空é´ä¸è¶³ï¼å次æåå°old genåºï¼èold genåºå
åä¹ä¸å¤çæ
åµä¸äº§çäºpromontion faildä»è导è´full gc.é£å¯ä»¥æ¨æåºï¼eden+from survivor < old genåºå©ä½å
åæ¶ï¼ä¸ä¼åºç°promontion faildçæ
åµï¼å³ï¼
ãã(Xmx-Xmn)*(1-CMSInitiatingOccupancyFraction/100)>=(Xmn-Xmn/(SurvivorRatior+2)) è¿èæ¨æåºï¼
ããCMSInitiatingOccupancyFraction <=((Xmx-Xmn)-(Xmn-Xmn/(SurvivorRatior+2)))/(Xmx-Xmn)*100
ããä¾å¦ï¼
ããå½xmx=128 xmn=36 SurvivorRatior=1æ¶ CMSInitiatingOccupancyFraction<=((128.0-36)-(36-36/(1+2)))/(128-36)*100 =73.913
ããå½xmx=128 xmn=24 SurvivorRatior=1æ¶ CMSInitiatingOccupancyFraction<=((128.0-24)-(24-24/(1+2)))/(128-24)*100=84.615â¦
ããå½xmx=3000 xmn=600 SurvivorRatior=1æ¶ CMSInitiatingOccupancyFraction<=((3000.0-600)-(600-600/(1+2)))/(3000-600)*100=83.33
ããCMSInitiatingOccupancyFractionä½äº70% éè¦è°æ´xmnæSurvivorRatiorå¼ã
温馨提示:内容为网友见解,仅供参考