JVM å ååæå·¥å · MAT çæ·±åº¦è®²è§£ä¸å®è·µââè¿é¶ç¯(转载)
åæä½è ï¼https://juejin.cn/user/1275089220539869
åæä½è å ¬ä¼å·ï¼ Qçå客ã
åæé¾æ¥ï¼https://juejin.cn/post/6911624328472133646
æ¬ç³»åå ±ä¸ç¯æç« ï¼ æ¬ææ¯ç³»å第2ç¯ââè¿é¶ç¯ï¼è¯¦ç»è®²è§£ MAT åç§å·¥å ·çæ ¸å¿åè½ãç¨æ³ãéç¨åºæ¯ï¼å¹¶å¨å ·ä½å®æåºæ¯ä¸è®²è§£å¸®å¤§å®¶å¦ä¹ å¦ä½é对åç±»å åé®é¢ã
- ãJVM å ååæå·¥å · MAT çæ·±åº¦è®²è§£ä¸å®è·µââå ¥é¨ç¯ã ä»ç» MAT 产ååè½ãåºç¡æ¦å¿µãä¸å ¶ä»å·¥å ·å¯¹æ¯ãQuick Start æåã
- ãJVM å ååæå·¥å · MAT çæ·±åº¦è®²è§£ä¸å®è·µââè¿é¶ç¯ã å±å¼å¹¶è¯¦ç»è®²è§£ MAT åç§å·¥å ·çæ ¸å¿åè½ãç¨æ³ãåºæ¯ï¼å¹¶å¨å ·ä½å®æåºæ¯ä¸è®²è§£å¸®å¤§å®¶å æ·±ä½ä¼ã
- ãJVM å ååæå·¥å · MAT çæ·±åº¦è®²è§£ä¸å®è·µââé«é¶ç¯ã æ»ç»å¤æå åé®é¢çç³»ç»æ§åææ¹æ³ï¼å¹¶éè¿ä¸ä¸ªç»¼åæ¡ä¾æå大家ç宿è½åã
çç»ææ¡ MAT æ¯ Java 髿çå¿ å¤è½åï¼ä½å®è·µæ¶å¤§å®¶å¾å¾éé¢å¯¹ä¼å¤åè½ï¼ç¼è±ç¼ä¹±ä¸ç¥å¦ä½ä¸æï¼å°ç¼ä¹æ²¡ææ¾å°ä¸ç¯å®åçæå¦ç´ æï¼æä»¥æ´çæ¬æå¸®å¤§å®¶ç³»ç»ææ¡ MAT åæå·¥å ·ã
æ¬æè¯¦ç»è®²è§£ MAT ä¼å¤å ååæå·¥å ·åè½ï¼è¿äºåè½ç»å使ç¨å¼å¸¸å¼ºå¤§ï¼çç»ä½¿ç¨å ä¹å¯ä»¥è§£å³ææçå å å离线åæçé®é¢ãæä»¬å°åè½åå为4ç±»ï¼å ååå¸è¯¦æ ã对象é´ä¾èµãå¯¹è±¡ç¶æè¯¦æ ãææ¡ä»¶æ£ç´¢ãæ¯å¤§ç±»æå¤ä¸ªåè½ç¹ï¼æ¬æä¼éä¸è®²è§£ååè½çåºæ¯åç¨æ³ãæ¤å¤ï¼æ·»å äºååæå¼ç¨æ¡ä¾å 强çè§£åææ¡ã
注ï¼å¨è¯¥ç³»åå¼ç¯æç« ãJVM å
ååæå·¥å
· MAT çæ·±åº¦è®²è§£ä¸å®è·µââå
¥é¨ç¯ãä¸ä»ç»äº MAT ç使ç¨åºæ¯åå®è£
æ¹æ³ï¼ä¸çæ MAT ç读è
建议å
é
è¯»ä¸æå¹¶å®è£
ï¼æ¬ææ¡ä¾å¾å®¹æå¨æ¬å°å®è·µãå¦å¤ï¼ä¸æä¸äº§åä»ç»é¨å顺åºä¹å¯¹åºæ¬æåè½è®²è§£çç»ç»ï¼å¦ä¸å¾ï¼
为åå°å¯¹ç¼è±ç¼ä¹±çèåçè¿·è«ï¼å¯ä»¥éè¿ä¸å¾å
æ´ä½çæä¸ååè½ä½¿ç¨å
¥å£ï¼åç»é½ä¼è®²å°ã
2.1 å ¨å±ä¿¡æ¯æ¦è§
åè½ï¼å±ç°å å å大å°ã对象æ°éãclass æ°éãclass loader æ°éãGC Root æ°éãç¯å¢åéãçº¿ç¨æ¦åµçå ¨å±ç»è®¡ä¿¡æ¯ã
使ç¨å ¥å£ï¼MAT 主çé¢ â Heap Dump Overviewã
举ä¾ï¼ä¸é¢æ¯å¯¹è±¡æ°éãclass loader æ°éãGC Root æ°éï¼å¯ä»¥çåº class loader åå¨å¼å¸¸ã
举ä¾ï¼ä¸å¾æ¯çº¿ç¨æ¦åµï¼å¯ä»¥æ¥çæ¯ä¸ªçº¿ç¨åã线ç¨ç Retained Heapãdaemon 屿§çã
使ç¨åºæ¯ å ¨å±æ¦è§åç°å ¨å±ç»è®¡ä¿¡æ¯ï¼éç¹æ¥çæ´ä½æ¯å¦æå¼å¸¸æ°æ®ï¼æä»¥ææä¿¡æ¯æéï¼ä¸é¢å ç§åºæ¯æä¸å®å¸®å©ï¼
- æ¹æ³åºæº¢åºæ¶ï¼Java 8åä¸ä½¿ç¨æ¹æ³åºï¼å¯¹åºå 溢åºï¼ï¼æ¥ç class æ°éå¼å¸¸å¤ï¼å¯ä»¥èèæ¯å¦ä¸ºå¨æä»£çç±»å¼å¸¸è½½å ¥è¿å¤æç±»è¢«åå¤éå¤å è½½ã
- æ¹æ³åºæº¢åºæ¶ï¼æ¥ç class loader æ°éè¿å¤ï¼å¯ä»¥èèæ¯å¦ä¸ºèªå®ä¹ class loader 被å¼å¸¸å¾ªç¯ä½¿ç¨ã
- GC Root è¿å¤ï¼å¯ä»¥æ¥ç GC Root åå¸ï¼ç论ä¸è¿ç§æ 嵿å°ä¼éå°ï¼ç¬è åªå¨ JNI 使ç¨ä¸ä¸ªåå¨ BUG çåºæ¶éå°è¿ã
- çº¿ç¨æ°è¿å¤ï¼ä¸è¬æ¯é¢ç¹å建线ç¨ä½æ æ³æ§è¡ç»æï¼ä»æ¦è§å¯ä»¥äºè§£å¼å¸¸è¡¨è±¡ï¼å ·ä½åå å¯ä»¥åèæ¬æçº¿ç¨åæé¨åå å®¹ï¼æ¤å¤ä¸å±å¼ã
2.2 Dominator tree
_注ï¼ç¬è 使ç¨é¢çç Top1ï¼æ¯é«æåæ Dump å¿ ççåè½ã _
åè½
- å±ç°å¯¹è±¡çæ¯é å ³ç³»å¾ï¼å¹¶ç»åºå¯¹è±¡æ¯é å åç大å°ï¼æ¯é å åçåäº Retained Heapï¼å³å ¶è¢« GC åæ¶å¯éæ¾çå å大å°ï¼
- æ¯ææåºãæ¯ææ packageãclass loaderãsuper classãclass èç±»ç»è®¡
使ç¨å ¥å£ï¼å ¨å±æ¯é æ ï¼ MAT 主çé¢ â Dominator treeã
举ä¾ï¼ ä¸å¾ä¸éè¿æ¥ç Dominator treeï¼äºè§£å°å åä¸»è¦æ¯ç± ThreadAndListHolder-thread å main ä¸¤ä¸ªçº¿ç¨æ¯é ï¼åé¢ç¬¬2.6èä¼ç»åºæ´ä½æ¡ä¾ï¼ã
使ç¨åºæ¯
- å¼å§ Dump åææ¶ï¼é¦å åºä½¿ç¨ Dominator tree äºè§£åæ¯é æ èµ·ç¹å¯¹è±¡ææ¯é å åç大å°ï¼è¿èäºè§£åªå 个起ç¹å¯¹è±¡æ¯ GC æ æ³éæ¾å¤§å åçåå ã
- å½ä¸ªå«å¯¹è±¡æ¯é
æ ç Retained Heap å¾å¤§å卿æ¾å¾ææ¶ï¼å¯ä»¥éç¹åæå æ¯é«ç对象æ¯é
å
³ç³»ï¼å±å¼åæ è¿ä¸æ¥å®ä½å°é®é¢æ ¹å ï¼å¦ä¸å¾ä¸å¯çåºæç»æ¯ SameContentWrapperContainer 对象ææç ArrayList è¿å¤§ã
- å¨ Dominator tree ä¸å±å¼æ ç¶å¾ï¼å¯ä»¥æ¥çæ¯é å ³ç³»è·¯å¾ï¼ä¸ outgoing reference çåºå«æ¯ï¼å¦æ X æ¯é Yï¼å X éæ¾å Yå¿ ç¶å¯éæ¾ï¼å¦æä» ä» æ¯ X å¼ç¨ Yï¼å¯è½ä»æå ¶ä»å¯¹è±¡å¼ç¨ Yï¼X éæ¾å Y ä»ä¸è½éæ¾ï¼æä»¥ Dominator tree å»é¤äº incoming reference ä¸å¤§éçåä½ä¿¡æ¯ï¼ã
- æäºæ
åµä¸å¯è½å¹¶æ²¡ææ¯é
èµ·ç¹å¯¹è±¡ç Retained Heap å ç¨å¾å¤§å
åï¼æ¯å¦ class X æ100ä¸ªå¯¹è±¡ï¼æ¯ä¸ªå¯¹è±¡ç Retained Heap æ¯10Mï¼å class X ææå¯¹è±¡å®é
æ¯é
çå
忝 1Gï¼ä½å¯è½ Dominator tree çå20ä¸ªé½æ¯å
¶ä»class ç对象ï¼ï¼è¿æ¶å¯ä»¥æ classãpackageãclass loader åèåï¼è¿èå®ä½ç®æ ã
- ä¸å¾ä¸å GC Roots ææ¯é
çå
ååä¸å¤§ï¼è¿æ¶éè¦èåå®ä½çåç¹ã
- å¨ Dominator tree å±ç°åæ class èåï¼å¦ä¸å¾ï¼
- å¯ä»¥å®ä½å°æ¯ SomeEntry 对象æ¯é
å
åè¾å¤ï¼ç¶åç»å代ç è¿ä¸æ¥åæå
·ä½åå ã
- ä¸å¾ä¸å GC Roots ææ¯é
çå
ååä¸å¤§ï¼è¿æ¶éè¦èåå®ä½çåç¹ã
- å¨ä¸äºæä½åå®ä½å°å¼å¸¸ææ Retained Heap 对象åï¼å¦ä»ä»£ç ç对象åºè¯¥è¢«åæ¶ï¼ï¼å¯ä»¥è·å对象çç´æ¥æ¯é
è
ï¼æä½æ¹å¼å¦ä¸ã
2.3 Histogram ç´æ¹å¾
注ï¼ç¬è 使ç¨é¢ç Top2
åè½
- ç½åæ¯ä¸ªç±»å®ä¾çæ°éãç±»å®ä¾ç´¯è®¡å åå æ¯ï¼å æ¬èªèº«å åå ç¨éï¼Shallow Heapï¼åæ¯é 对象çå åå ç¨éï¼Retain Heapï¼ã
- æ¯ææå¯¹è±¡æ°éãRetained HeapãShallow Heapï¼é»è®¤æåºï¼çææ æåºï¼æ¯æææ£åè¿æ»¤ï¼æ¯ææ packageãclass loaderãsuper classãclass èç±»ç»è®¡ï¼
使ç¨å
¥å£ï¼MAT 主çé¢ â Histogramï¼æ³¨æ Histogram é»è®¤ä¸å±ç° Retained Heapï¼å¯ä»¥ä½¿ç¨è®¡ç®å¨å¾æ 计ç®ï¼å¦ä¸å¾æç¤ºã
使ç¨åºæ¯
- æäºæ åµ Dominator tree æ æ³å±ç°åºçç¹å¯¹è±¡ï¼ä¸ææå° Dominator tree æ¯é å åæåå20çå æ¯åä¸é«ï¼æè æ class èå乿 ææ¾çç¹å¯¹è±¡ï¼æ¤æ¶ Dominator tree å¾é¾åå ³èåæå¤æåªç±»å¯¹è±¡å æ¯é«ï¼ï¼è¿æ¶å¯ä»¥ä½¿ç¨ Histogram æ¥çææå¯¹è±¡æå±ç±»çåå¸ï¼å¿«éå®ä½å æ® Retained Heap 大头çç±»ã
- ä½¿ç¨æå·§
2.4 Leak Suspects
åè½ï¼å ·å¤èªå¨æ£æµå åæ³æ¼åè½ï¼ç½åå¯è½åå¨å åæ³æ¼çé®é¢ç¹ã
使ç¨å ¥å£ï¼ä¸è¬å½å卿æ¾çå åæ³æ¼æ¶ï¼åæå®Dumpæä»¶åå°±ä¼å±ç°ï¼ä¹å¯ä»¥å¦ä¸å¾å¨ MAT 主页 â Leak Suspectsã
使ç¨åºæ¯ï¼éè¦æ¥çå¼ç¨é¾æ¡ä¸å ç¨å åè¾å¤çå¯ç对象ãè¿ä¸ªåè½å¯è§£å³ä¸äºåºç¡é®é¢ï¼ä½å¤æçé®é¢å¾å¾å¸®å©æéã
举ä¾
- ä¸å¾ä¸ Leak Suspects è§å¾å±ç°äºä¸¤ä¸ªçº¿ç¨æ¯é
äºç»å¤§é¨åå
åã
- ä¸å¾æ¯ç¹å»ä¸å¾ä¸ Keywords ä¸ âDetailsâ ,è·åå®ä¾å° GC Root çæçè·¯å¾ãdominator è·¯å¾çç»ä¿¡æ¯ã
2.5 Top Consumers
åè½ï¼æå¤§å¯¹è±¡æ¥åï¼å¯ä»¥å±ç°åªäºç±»ãåªäº class loaderãåªäº package å ç¨æé«æ¯ä¾çå åï¼å ¶åè½ Histogram å Dominator tree ä¹é½æ¯æã
使ç¨åºæ¯ï¼åºç¨ç¨åºåçå åæ³æ¼æ¶ï¼æ¥çåªäºæ³æ¼ç对象éå¸¸å¨ Dump å¿«ç §ä¸ä¼å å¾å¤§çæ¯éãå æ¤ï¼å¯¹ç®åçé®é¢å ·æè¾é«çä»·å¼ã
2.6 ç»¼åæ¡ä¾ä¸
使ç¨å·¥å ·é¡¹ï¼Heap dump overviewãDominator treeãHistogramãClass Loader Explorerï¼è§3.4èï¼ãincoming referencesï¼è§3.1èï¼
ç¨åºä»£ç
1 | |
1 | |
1 | |
å¼ç¨å
³ç³»å¾
åæè¿ç¨
- é¦å
è¿å
¥ Dominator treeï¼å¯ä»¥çåºæ¯ SameContentWrapperContainerProxy å¯¹è±¡ä¸ main 线ç¨ä¸¤è
ææ99%å
åä¸è½éæ¾å¯¼è´ OOMã
- å
æ¥çæ¹åä¸ï¼å¨ Heap Dump Overview ä¸å¯ä»¥å¿«éå®ä½å° Number of class loaders æ°è¾¾50ä¸ä»¥ä¸ï¼è¿ç§åºæ¬å±äºå¼å¸¸æ
åµï¼å¦ä¸å¾æç¤ºã
- ä½¿ç¨ Class Loader Explorer åæå·¥å
·ï¼æ¤æ¶ä¼å±ç°ç±»å 载详æ
ï¼å¯ä»¥çå°æ524061个 class loaderãæä»¬çæ¡ä¾ä¸ä»
æClassLoaderOOMOps è¿æ ·çèªå®ä¹ç±»å è½½å¨ï¼æä»¥å¾å¿«å¯ä»¥å®ä½å°é®é¢ã
- å¦æç±»å è½½å¨è¾å¤ï¼ä¸è½ç¡®å®æ¯åªä¸ªå¼åé®é¢ï¼åå¯ä»¥å°ææç class loader对象æç±»åèç±»ï¼å¦ä¸å¾æç¤ºã
- Histogram 伿 ¹æ® class èåï¼å¹¶å±ç°å¯¹è±¡æ°é级å
¶ Shallow Heap å Retained Heapï¼å¦Retained Heap项ç®ä¸ºç©ºï¼å¯ä»¥ç¹å»ä¸å¾ä¸è®¡ç®æºç徿 å¹¶è®¡ç® Retained Heapï¼ï¼å¯ä»¥çå° ClassLoaderOOMOps æ524044个对象ï¼å
¶ Retain Heap å æ®äº370M以ä¸ï¼ä¸è¿°ä»£ç æ¯100Må·¦å³ï¼ã
- ä½¿ç¨ incoming referencesï¼å¯ä»¥æ¾å°å建ç代ç ä½ç½®ã
- åæ¥çæ¹åäºï¼åæ ·å¨å æ®319Må
åç Obejct æ°ç»éç¨ incoming references æ¥çå¼ç¨è·¯å¾ï¼ä¹å¾å®¹æå®ä½å°å
·ä½ä»£ç ä½ç½®ãå¹¶ä¸ä»ä¸å¾ä¸æä»¬çåºï¼Dominator tree çèµ·ç¹å¹¶ä¸ä¸å®æ¯ GCæ ¹ï¼ä¸éè¿ Dominator tree å¯è½æ æ³è·åå°æå¼å§çå建路å¾ï¼ä½ incoming references æ¯å¯ä»¥çã
3.1 References
注ï¼ç¬è 使ç¨é¢ç Top2
åè½ï¼å¨å¯¹è±¡å¼ç¨å¾ä¸æ¥çæä¸ªç¹å®å¯¹è±¡çææå¼ç¨å ³ç³»ï¼æä¾å¯¹è±¡å¯¹å ¶ä»å¯¹è±¡æåºæ¬ç±»åçå¼ç¨å ³ç³»ï¼ä»¥å被å¤é¨å ¶ä»å¯¹è±¡çå¼ç¨å ³ç³»ï¼ãéè¿ä»»ä¸å¯¹è±¡çç´æ¥å¼ç¨åé´æ¥å¼ç¨è¯¦æ ï¼ä¸»è¦æ¯å±æ§å¼åå åå ç¨ï¼ï¼æä¾å®åçä¾èµé¾è·¯è¯¦æ ã
使ç¨å ¥å£ï¼ç®æ åå³é® â List objects â with outgoing references/with incoming references.
使ç¨åºæ¯
- outgoing referenceï¼æ¥ç对象æå¼ç¨ç对象ï¼å¹¶æ¯æé¾å¼ä¼ éæä½ã妿¥çä¸ä¸ªå¤§å¯¹è±¡ææåªäºå 容ï¼å½ä¸ä¸ªå¤æå¯¹è±¡ç Retained Heap è¾å¤§æ¶ï¼éè¿ outgoing reference å¯ä»¥æ¥çç±åªä¸ªå±æ§å¼åãä¸å¾ä¸ A æ¯é Fï¼ä¸ F å æ®å¤§éå åï¼ä½ä¼åæ¶ F çç´æ¥æ¯é 对象 A æ æ³ä¿®æ¹ãå¯éè¿ outgoing reference çå ³ç³»é¾ä¸ DãBãEãCï¼å¹¶ç»åä¸å¡é»è¾ä¼åä¸é´ç¯èï¼è¿ä¾æ dominator tree æ¯åä¸å°çã
- incoming referenceï¼æ¥ç对象被åªäºå¯¹è±¡å¼ç¨ï¼å¹¶æ¯æé¾å¼ä¼ éæä½ã妿¥çä¸ä¸ªå¤§å¯¹è±¡é½è¢«åªäºå¯¹è±¡å¼ç¨ï¼ä¸å¾ä¸ K å å åå¤§ï¼æä»¥ J ç Retained Heap è¾å¤§ï¼ç®æ æ¯ä» GC Roots æé¤ J å¼ç¨ï¼ä½å¨ Dominator tree ä¸ J æ¯æ æ ¹ï¼æ æ³è·åå ¶è¢«å¼ç¨è·¯å¾ï¼å¯éè¿ incoming reference æ¥çå ³ç³»é¾ä¸ç HãXãY ï¼å¹¶ç»åä¸å¡é»è¾å° J ä» GC Root 龿é¤ã
3.2 Thread overview
åè½ï¼å±ç°è½¬å¨ dump æä»¶æ¶çº¿ç¨æ§è¡æ ãçº¿ç¨æ å¼ç¨ç对象ç详ç»ç¶æï¼ä¹æä¾å线ç¨ç Retained Heap çå ³èå åä¿¡æ¯ã
使ç¨å ¥å£ï¼MAT 主页 â Thread overview
使ç¨åºæ¯
- æ¥çä¸åçº¿ç¨ææçå åå æ¯ï¼å®ä½é«å åæ¶è线ç¨ï¼å¼åæå·§ï¼ä¸è¦ç´æ¥ä½¿ç¨ Thread æ Executor é»è®¤çº¿ç¨åé¿å å ¨é¨æ··åå¨ä¸èµ·ï¼ä½¿ç¨çº¿ç¨å°½éèªå½åæ¹ä¾¿è¯å«ï¼å¦ä¸å¾ä¸ ThreadAndListHolder-thread æ¯èªå®ä¹çº¿ç¨åï¼å¯ä»¥å¾å®¹æå®ä½å°å ·ä½ä»£ç ï¼
- æ¥ç线ç¨çæ§è¡æ ååéï¼ç»åä¸å¡ä»£ç äºè§£çº¿ç¨é»å¡å¨ä»ä¹å°æ¹ï¼ä»¥åæ æ³ç»§ç»è¿è¡éæ¾å
åï¼å¦ä¸å¾ä¸ ThreadAndListHolder-thread é»å¡å¨ sleep æ¹æ³ã
3.3 Path To GC Roots
åè½ï¼æä¾ä»»ä¸å¯¹è±¡å° GC Root çè·¯å¾è¯¦æ ã
使ç¨å ¥å£ï¼ç®æ åå³é® â Path To GC Roots
使ç¨åºæ¯ï¼ææ¶ä½ 确信已ç»å¤çäºå¤§ç对象éåä½ä¾ç¶æ æ³åæ¶ï¼è¯¥åè½è½å¿«éå®ä½å¼å¸¸å¯¹è±¡ä¸è½è¢« GC åæ¶çåå ï¼ç´å»å¼å¸¸å¯¹è±¡å° GC Root çå¼ç¨è·¯å¾ãæ¯ incoming reference çä¼å¿æ¯å±è½æå¾å¤ä¸éå ³æ³¨çå¼ç¨å ³ç³»ï¼æ¯ Dominator tree çä¼å¿æ¯å¯ä»¥å¾å°æ´å ¨é¢çä¿¡æ¯ã
å°æå·§ï¼å¨ææ¥å åæ³æ¼æ¶ï¼å»ºè®®éæ© exclude all phantom/weak/soft etc.references æé¤èå¼ç¨/å¼±å¼ç¨/软å¼ç¨ççå¼ç¨é¾ï¼å 为被èå¼ç¨/å¼±å¼ç¨/软å¼ç¨ç对象å¯ä»¥ç´æ¥è¢« GC ç»åæ¶ï¼èç¦å¨å¯¹è±¡å¦è¿åå¨ Strong å¼ç¨é¾å³å¯ã
3.4 class loader åæ
åè½
- æ¥çå 䏿æ class loader çä½¿ç¨æ åµï¼å ¥å£ï¼MAT 主页èåèè²æ¡¶å¾æ â Java Basics â Class Loader Explorerï¼ã
- æ¥çå ä¸è¢«ä¸åclass loader éå¤å è½½çç±»ï¼å ¥å£ï¼MAT 主页èåèè²æ¡¶å¾æ â Java Basics â Duplicated Classesï¼ã
使ç¨åºæ¯
- å½ä» Heap dump overview äºè§£å°ç³»ç»ä¸ class loader è¿å¤ï¼å¯¼è´å ç¨å åå¼å¸¸æ¶è¿å ¥æ´ç»è´çåæå®ä½æ ¹å æ¶ä½¿ç¨ã
- è§£å³ NoClassDefFoundError é®é¢ææ£æµ jar å æ¯å¦è¢«éå¤å è½½
å ·ä½ä½¿ç¨æ¹æ³å¨ 2.6 å 3.5 两èçæ¡ä¾ä¸æä»ç»ã
3.5 ç»¼åæ¡ä¾äº
使ç¨å·¥å ·é¡¹ï¼class loaderï¼éå¤ç±»æ£æµï¼ãinspectorãæ£åæ£ç´¢ã
å¼å¸¸ç°è±¡ ï¼è¿è¡æ¶æ¥ NoClassDefFoundErrorï¼å¨ classpath ä¸æä¸¤ä¸ªä¸åçæ¬çååç±»ã
åæè¿ç¨
- è¿å
¥ MAT å·²å è½½çéå¤ç±»æ£æµåè½ï¼æ¹å¼å¦ä¸å¾ã
- å¯ä»¥çå°ææéå¤çç±»ï¼ä»¥åç¸å
³çç±»å è½½å¨ï¼å¦ä¸å¾ã
- æ ¹æ®ç±»åï¼å¨
<Regex>æ¡ä¸è¾å ¥ç±»åå¯ä»¥è¿æ»¤æ æä¿¡æ¯ã - éä¸ç®æ ç±»ï¼éè¿Inspectorè§å¾ï¼å¯ä»¥çå°è¢«å è½½çç±»å
·ä½æ¯å¨åªä¸ªjarå
éãï¼æ¬ä¾ä¸éå¤çç±»æ¯è¢« URLClassloader å è½½çï¼å³é®ç¹å» â_contextâ 屿§ï¼æåç¹å» âGo Intoâï¼å¨å¼¹åºççªå£ä¸ç屿§ â_warâ 弿¯è¢«å 载类çå
·ä½å
ä½ç½®ï¼
4.1 inspector
åè½ï¼MAT éè¿ inspector 颿¿å±ç°å¯¹è±¡ç详æ ä¿¡æ¯ï¼å¦éæå±æ§å¼åå®ä¾å±æ§å¼ãå åå°åã类继æ¿å ³ç³»ãpackageãclass loaderãGC Roots çè¯¦æ æ°æ®ã
使ç¨åºæ¯
- å½å å使ç¨éä¸ä¸å¡é»è¾æè¾å¼ºå ³èçåºæ¯ï¼éè¿ inspector å¯ä»¥éè¿æ¥çå¯¹è±¡å ·ä½å±æ§å¼ãæ¯å¦ï¼ç¤¾äº¤åºæ¯ä¸æä¸ªç¨æ·å¯¹è±¡ç好åå表å¼å¸¸ï¼å ¶ List é¿åº¦è¾¾å°å 亿ï¼éè¿ inspector 颿¿è·åå°å¼å¸¸ç¨æ· IDï¼è¿èä»ä¸å¡è§è§ç»§ç»ææ¥å±äºåªä¸ªç¨æ·ï¼æ¬ä¾å¯è½æç³»ç»è´¦å·ï¼ä¸ææç¨æ·æ¯å¥½åã
- éåçç±»åç使ç¨ä¼è¾å¤ï¼å¦æ¥ç ArrayList ç size 屿§ä¹å°±äºè§£å ¶å¤§å°ã
举ä¾ï¼ä¸å¾ä¸å·¦è¾¹ç Inspector çªå£å±ç°äºå°å 0x125754cf8 ç ArrayList å®ä¾è¯¦æ
ï¼å
æ¬ modCount çå¹¶ä¸ä¼å¨ outgoing references å±ç°çåºæ¬å±æ§ã
4.2 éåç¶æ
åè½ï¼å¸®å©æ´ç´è§çäºè§£ç³»ç»çå åä½¿ç¨æ åµï¼æ¥æ¾æµªè´¹çå å空é´ã
使ç¨å ¥å£ï¼MAT 主页 â Java Collections â å¡«å ç/Hashå²çªçåè½ã
使ç¨åºæ¯
- éè¿å¯¹ ArrayList ææ°ç»çéå类对象æå¡«å çèç±»ï¼å®ä½ç¨çæç©ºéåç±»å¯¹è±¡é æçå åæµªè´¹ã
- éè¿ HashMap å²çªçå¤å® hash çç¥æ¯å¦åçã
å ·ä½ä½¿ç¨æ¹æ³å¨ 4.3 èæ¡ä¾è¯¦ç»ä»ç»ã
4.3 ç»¼åæ¡ä¾ä¸
使ç¨å·¥å ·é¡¹ï¼Dominator treeãHistogramãéå ratioã
å¼å¸¸ç°è±¡ ï¼ç¨åº OOMï¼ä¸ Dominator tree æ 大对象ï¼éè¿ Histogram äºè§£å°å¤ä¸ª ArrayList å æ®å¤§éå åï¼ææéè¿åå° ArrayList ä¼åç¨åºã
ç¨åºä»£ç
1 | |
åæè¿ç¨
- ä½¿ç¨ Dominator tree æ¥çå¹¶æ é«å æ¯èµ·ç¹ã
- ä½¿ç¨ Histogram å®ä½å° ListHolder å ArrayList å æ¯è¿é«ï¼ç»è¿ä¸å¡åæå¾å¤ List å¡«å
çå¾ä½æµªè´¹å
åã
- æ¥ç ArrayList çå¡«å
çï¼MAT é¦é¡µ â Java Collections â Collection Fill Ratioã
- æ¥çç±»åå¡«å java.util.ArrayListã
- ä»ç»æå¯ä»¥çåºç»å¤§é¨å ArrayList åå§ç³è¯·é¿åº¦è¿å¤§ã
5.1 OQL
åè½ï¼æä¾ä¸ç§ç±»ä¼¼äºSQLç对象ï¼ç±»ï¼çº§å«ç»ä¸ç»æåæ¥è¯¢è¯è¨ï¼æ ¹æ®æ¡ä»¶å¯¹å ä¸å¯¹è±¡è¿è¡çéã
è¯æ³
1 | |
- Select åå¥å¯ä»¥ä½¿ç¨â*âï¼æ¥çç»æå¯¹è±¡çå¼ç¨å®ä¾ï¼ç¸å½äº outgoing referencesï¼ï¼å¯ä»¥æå®å ·ä½çå 容ï¼å¦ Select OBJECTS v.elementData from xx æ¯è¿åçç»ææ¯å®æ´ç对象ï¼è䏿¯ç®åç对象æè¿°ä¿¡æ¯)ï¼å¯ä»¥ä½¿ç¨ Distinct å ³é®è¯å»éã
- From æå®æ¥è¯¢èå´ï¼ä¸è¬æå®ç±»åãæ£å表达å¼ã对象å°åã
- Where ç¨æ¥æå®ç鿡件ã
- å ¨é¨è¯æ³è¯¦è§ï¼OQL è¯æ³
- æªæ¯æçæ ¸å¿åè½ï¼group by valueï¼å¦ææéæ±å¯ä»¥å 导åºç»æå° csv ä¸ï¼åä½¿ç¨ awk çèæ¬å·¥å ·åæå³å¯ã
- ä¾åï¼æ¥æ¾ sizeï¼0 䏿ªä½¿ç¨è¿ç ArrayListï¼select * from java.util.ArrayList where size=0 and modCount=0ã
使ç¨åºæ¯
- ä¸è¬æ¯è¾å¤æçé®é¢ä¼ä½¿ç¨ OQLï¼èä¸è¿ç±»é®é¢å¾å¾ä¸ä¸å¡é»è¾æè¾å¤§å ³ç³»ãæ¯å¦å¤§éçå°å¯¹è±¡æ´ä½å ç¨å åé«ï¼ä½é¢æå°å¯¹è±¡åºè¯¥ä¸ä¼è¿å¤ï¼æ¯å¦è¾¾å°ç¾ä¸ä¸ªï¼ï¼ä¸ä¸ªä¸ä¸ªçåä¸ç°å®ï¼å¯ä»¥éç¨ OQL æ¥è¯¢å¯¼åºæ°æ®ææ¥ã
- ä¾åï¼å¾®æå¡çåå¸å¼é¾è·¯è¿½è¸ªç³»ç»ï¼ééåæå¡æææ¥å£åï¼å ±è®¡200个æå¡å´ééå°äº200ä¸ä¸ªæ¥å£åï¼ä¸ä¸ªæå¡ä¸ä¼æ1ä¸ä¸ªæ¥å£ï¼ï¼è¿æ¶ç´æ¥å¨ List ä¸ä¸ä¸ªä¸ªæ¥çå¾é¾å®ä½ï¼å¯ä»¥ç´æ¥ç¨ OQL 导åºï¼å®ä½åªä¸ªæå¡æ¥å£åæ¶éå¼å¸¸ï¼å¦æ URL ä¸ ID ä¹ç»è®¡å°æ¥å£ä¸äºï¼
5.2 æ£ç´¢åçé
åè½ï¼æ¬æç¬¬äºç« å ååå¸ï¼ç¬¬ä¸ç« 对象é´ä¾èµçä¼å¤åè½ï¼åæ¯ææå符串æ£ç´¢ãææ£åæ£ç´¢çæä½ã
使ç¨åºæ¯ï¼å¨ä½¿ç¨ HistogramãThread overview çåè½æ¶ï¼å¯ä»¥è¿ä¸æ¥æ·»å å符串å¹é ãæ£åå¹é æ¡ä»¶è¿æ»¤ç¼©å°ææ¥èå´ã
5.3 æå°å寻å
åè½ï¼æ ¹æ®å¯¹è±¡çèæå ååå è¿å¶å°åæ¥æ¾å¯¹è±¡ã
使ç¨åºæ¯ï¼ä» ç¥éå°åå¹¶å¸æå¿«éæ¥ç对象ååç»åææ¶ä½¿ç¨ï¼å ¶ä½å¯ä»¥ç´æ¥ä½¿ç¨ outgoing reference äºè§£å¯¹è±¡ä¿¡æ¯ã
5.4 ç»¼åæ¡ä¾å
使ç¨å·¥å ·é¡¹ï¼OQLãHistogramãincoming references
å¼å¸¸ç°è±¡åç®ç ï¼ç¨åºå ç¨å åé«ï¼åå¨é»è®¤åå§åè¾é¿ç ArrayListï¼éåæ ArrayList 被使ç¨çå æ¯ï¼éè¿æ°æ®æ¯ææ¯å¦éç¨æå 载模å¼ï¼å¹¶åæå ·ä½åªå代ç å建äºç©º ArrayListã
ç¨åºä»£ç
1 | |
åæè¿ç¨
- å å䏿50ä¸ä¸ª capacity = 10 ç空 ArrayList å®ä¾ãæä»¬åæä¸è¿äºå¯¹è±¡çå ç¨å 忻大å°å对象å建ä½ç½®ï¼ä»¥ä¾¿åæå»¶è¿åå§åï¼å³ç´å°ä½¿ç¨è¿äºå¯¹è±¡çæ¶åæå°ä¹å®ä¾åï¼å¦åä¸ç´ä¸ºnullï¼æ¯å¦æå¿ è¦ã
- ä½¿ç¨ OQL æ¥è¯¢åºåå§ååæªè¢«ä½¿ç¨ç ArrayListï¼size=0 ä¸ modCount=0ï¼ï¼è¯å¥å¦ä¸å¾ãå¯ä»¥çåºå
¬æ 150 ä¸ä¸ªç©º ArrayListï¼è¿äºå¯¹è±¡å±äºæµªè´¹å
åãæä»¬æ¥ä¸æ¥è®¡ç®ä¸æ»è®¡å ç¨å¤å°å
åï¼å¹¶æ ¹æ®ç»æçæ¯å¦éè¦ä¼åã
- è®¡ç® 150ä¸ ArrayListå å
åæ»éï¼ç´æ¥ç¹å»å³ä¸æ¹å¸¦é»è²ç®å¤´ç Histogram 徿 ï¼è¿ä¸ªå¾æ æ¯å¨éå®çç»æåç¨ç´æ¹å¾å±ç¤ºï¼æ»è®¡æ¯é
äº120M å·¦å³å
åï¼æä»¥è¿éç¹å»ç»æï¼ä¸å
å« modCount æ size 大äº0ç ArrayList 对象ï¼ãè¿ç±»å¨éå®ç»æç»§ç»åæå¾å¤åè½é½æ¯æï¼å¦æ£åæ£ç´¢ãHistogramãDominator treeççã
- æ¥çä¸ç©º ArrayList çå
·ä½æ¥æºï¼å¯ç¨ incoming referencesï¼ä¸å¾ä¸æ¾ç¤ºäºæ¸
æ°ç对象å建路å¾ã
è³æ¤æ¬æè®²è§£äº MAT åé¡¹å·¥å ·çåè½ãä½¿ç¨æ¹æ³ãéç¨åºæ¯ï¼ä¹ç©¿æäº4ä¸ªå®ææ¡ä¾ï¼çç»ææ¡å¯¹åæ JVM å åé®é¢å¤§æè£¨çï¼å°¤å ¶æ¯åç§åè½çç»å使ç¨ãå¨ä¸ä¸ç¯ãJVM å ååæå·¥å · MAT çæ·±åº¦è®²è§£ä¸å®è·µââé«é¶ç¯ã伿»ç» JVM å å ååæçç³»ç»æ§æ¹æ³ï¼å¹¶å¨æ´å¤æçæ¡ä¾ä¸å®è·µã