1.Android Appå
åä¼å
Android Appå åä¼å
å åä¼åå°±æ¯å¯¹å åé®é¢çä¸ä¸ªé¢é²å解å³ï¼åå åä¼åè½è®©åºç¨æå¾å°ãæ´»å¾å¥½åæ´»å¾ä¹ ãæçå°ï¼
âæâæçæ¯ Crashï¼å åé®é¢å¯¼è´ Crash çå ·ä½è¡¨ç°å°±æ¯å å溢åºå¼å¸¸ OOMã
æ´»å¾å¥½ï¼
æ´»å¾å¥½æçæ¯ä½¿ç¨æµç ï¼Android ä¸é æçé¢å¡é¡¿çåå æå¾å¤ç§ï¼å ¶ä¸ä¸ç§å°±æ¯ç±å åé®é¢å¼èµ·çãå åé®é¢ä¹æ以ä¼å½±åå°çé¢æµç 度ï¼æ¯å 为åå¾åæ¶ï¼GCï¼Garbage Collectionï¼ï¼å¨ GC æ¶ï¼ææ线ç¨é½è¦åæ¢ï¼å æ¬ä¸»çº¿ç¨ï¼å½ GC åç»å¶çé¢çæä½åæ¶è§¦åæ¶ï¼ç»å¶çæ§è¡å°±ä¼è¢«æç½®ï¼å¯¼è´æ帧ï¼ä¹å°±æ¯çé¢å¡é¡¿ã
æ´»å¾ä¹ ï¼
æ´»å¾ä¹ æçæ¯æ们çåºç¨å¨åå°è¿è¡æ¶ä¸ä¼è¢«å¹²æãAndroid ä¼æç §ç¹å®çæºå¶æ¸ çè¿ç¨ï¼æ¸ çè¿ç¨æ¶ä¼å ä¼èèæ¸ çåå°è¿ç¨ãæ¸ çè¿ç¨çæºå¶å°±æ¯LowMemoryKillerãå¨ Android ä¸ä¸åçè¿ç¨æçä¸åçä¼å 级ï¼å½ä¸¤ä¸ªè¿ç¨çä¼å 级ç¸åæ¶ï¼ä½æä¼ä¼å èèå¹²ææ¶èå åæ´å¤çè¿ç¨ãä¹å°±æ¯å¦ææ们åºç¨å ç¨çå åæ¯å ¶ä»åºç¨å°ï¼å¹¶ä¸å¤äºåå°æ¶ï¼æ们çåºç¨è½å¨åå°æ´»ä¸æ¥ï¼è¿ä¹æ¯å åä¼å为æ们åºç¨å¸¦æ¥ç«äºåçä¸ä¸ªç´æ¥ä½ç°ã
å åå ç¨æ¯å¦è¶å°è¶å¥½ï¼
å½ç³»ç» å åå 足 çæ¶åï¼æ们å¯ä»¥å¤ç¨ ä¸äºè·å¾æ´å¥½çæ§è½ãå½ç³»ç» å åä¸è¶³ çæ¶åï¼æ们å¸æå¯ä»¥åå° âç¨æ¶åé ï¼åæ¶éæ¾âãå åä¼å并ä¸è½ä¸ååã
æ们é½ç¥éï¼åºç¨ç¨åºçå ååé ååå¾åæ¶é½æ¯ç±Androidèææºå®æçï¼å¨Android 5.0以ä¸ï¼ä½¿ç¨çæ¯Dalvikèææºï¼5.0å以ä¸ï¼å使ç¨çæ¯ARTèææºã
AndroidèææºDalvikåART
1ãå ååºååå
详ç»è¯·ç以ä¸ä¸¤ç¯æç« ï¼å»ºè®®å ¨çï¼ï¼
javaå åå大åº_JVMå ååºååå
Android å åæºå¶
2ãå ååæ¶
åå¾æ¶éçæ è®°ç®æ³ï¼æ¾å°åå¾ï¼ï¼
åå¾æ¶éç®æ³ï¼åæ¶åå¾ï¼ï¼
å¼ç¨ç±»åï¼å¼ºå¼ç¨ã软å¼ç¨ãå¼±å¼ç¨ãèå¼ç¨
对象çæææ§=å¯è¾¾æ§+å¼ç¨ç±»å
JAVAåå¾åæ¶æºå¶-å²ä¸æ容æç解çè¿ä¸ç¯å°±å¤äº
Androidï¼ç©è½¬åå¾åæ¶æºå¶ä¸å代åæ¶çç¥
androidä¸è¿åå¨ä½ææºå¶ï¼è¿ç§æ åµå±äºç³»ç»æ´æºå åä¸è¶³ï¼ç´æ¥æåºç¨è¿ç¨ææçæ åµã
Androidåå°ææ»ç³»åï¼LowMemoryKilleråç
1ãå å溢åº
ç³»ç»ä¼ç»æ¯ä¸ªAppåé å å空é´ä¹å°±æ¯heap sizeå¼ï¼å½appå ç¨çå åå ä¸ç³è¯·çå åè¶ è¿è¿ä¸ªç³»ç»åé çå åéé¢ï¼æç»å¯¼è´OOM(OutOfMemory)使ç¨åºå´©æºã
éè¿å½ä»¤ getprop |grep dalvik.vm.heapsize å¯ä»¥è·åç³»ç»å 许çæ大
注æï¼å¨è®¾ç½®äºheapgrowthlimitçç¶åµä¸ï¼å个è¿ç¨å¯ç¨æ大å å为heapgrowthlimitå¼ãå¨androidå¼åä¸ï¼è¥æ¯è¦ä½¿ç¨å¤§å ï¼é¡»è¦å¨manifestä¸æå®android:largeHeap为trueï¼è¿æ ·dvm heapæ大å¯è¾¾heapsizeã
å ³äºheapsize & heapgrowthlimit
2ãå åæ³æ¼
Androidç³»ç»èææºçåå¾åæ¶æ¯éè¿èææºGCæºå¶æ¥å®ç°çãGCä¼éæ©ä¸äºè¿åæ´»ç对象ä½ä¸ºå åéåçæ ¹èç¹GC Rootsï¼éè¿å¯¹GC Rootsçå¯è¾¾æ§æ¥å¤ææ¯å¦éè¦åæ¶ãå åæ³æ¼å°±æ¯ å¨å½ååºç¨å¨æå ä¸å使ç¨ç对象被GC Rootså¼ç¨ï¼é æ该对象æ æ³è¢«ç³»ç»åæ¶ï¼ä»¥è´è¯¥å¯¹è±¡å¨å ä¸æå ç¨çå ååå æ æ³è¢«éæ¾èé æå å空é´æµªè´¹ï¼ä½¿å®é å¯ä½¿ç¨å ååå°ãç®è¨ä¹ï¼å°±æ¯ 对象被ææ导è´æ æ³éæ¾æä¸è½æç §å¯¹è±¡æ£å¸¸ççå½å¨æè¿è¡éæ¾ã
Android常è§å åæ³æ¼æ±æ»
3ãå åæå¨
æçæ¯å¨çæ¶é´å 大éçæ°å¯¹è±¡è¢«å®ä¾åï¼è¿è¡æ¶å¯è½æ æ³æ¿è½½è¿æ ·çå ååé ï¼å¨è¿ç§æ åµä¸å°±ä¼å¯¼è´åå¾åæ¶äºä»¶è¢«å¤§éè°ç¨ï¼å½±åå°åºç¨ç¨åºçUIåæ´ä½æ§è½ï¼æç»å¯è½å¯¼è´å¡é¡¿åOOMã
常è§æ åµï¼å¨ä¸äºè¢«é¢ç¹è°ç¨çæ¹æ³å ä¸æå°å建对象ãä¾å¦å¨View çonDrawæ¹æ³å new ä¸äºæ°ç对象ã
注æå åæå¨ä¹ä¼å¯¼è´ OOMï¼ä¸»è¦åå æå¦ä¸ä¸¤ç¹ï¼
1ãAndroid Studio Profiler
ä½ç¨
ä¼ç¹
å åæå¨é®é¢å¤çå®æ
ç解å åæå¨çæ¦å¿µçè¯ï¼æ们就è½æç½åªè¦è½æ¾å°æå¨è¿ç¨ä¸æ产çç对象åå ¶è°ç¨æ ï¼æ们就è½è§£å³é®é¢ï¼å好Android Studio çPorfileréé¢çMemoryå·¥å ·å°±è½å¸®æ们记å½ä¸æ们æä½è¿ç¨ä¸æéæ¢çé¢æ产ççæ°å¯¹è±¡ï¼å¹¶ä¸è½æ¸ æ°çå°è¿äºå¯¹è±¡çè°ç¨æ ã
éæ©Profile ä¸ çMemory ï¼éæ© Record Java/Kotlin allocationsï¼åç¹å»Recordå¼å§è®°å½ï¼ Record Java/Kotlin allocations é项ä¼è®°å½ä¸æ°å¢ç对象ã
æä½å®æä¹åï¼ç¹å»å¦å¾æ示ç红èæé®ï¼åæ¢è®°å½ã
åæ¢è®°å½åï¼æ们就å¯ä»¥æåºï¼ç¹å» Allocationså¯ä»¥æåºï¼ççåªäºå¯¹è±¡æåºæ¬ç±»åå¨çæ¶é´è¢«é¢ç¹å建å¤ä¸ªï¼ç¹å»è¿äºæ°å¢ç对象就å¯ä»¥çå°å®çå®æçè°ç¨é¾äºï¼è¿èå°±æ¾æ¾å°å¯¼è´å åæå¨çå°æ¹å¨åªéäºã
2ãå©ç¨DDMS å MAT(Memory Analyzer tool)æ¥åæå åæ³æ¼
æ们å©ç¨å·¥å ·è¿è¡å åæ³æ¼åæ主è¦æ¯ç¨å¯¹æ¯æ³ï¼
a.å æå¼æ£å¸¸çé¢ï¼ä¸åä»»ä½æä½ï¼å æåä¸å¼å§çå æ件ã
b.ä¸é¡¿è¡ä¹±æä½ï¼åå°åæ¥æä½åççé¢ã主å¨è§¦åä¸ä¸¤æ¬¡GC,源码易语言闹钟源码è¿ç§åæå第äºæ¬¡å æ件ã
c.éè¿å·¥å ·å¯¹æ¯ï¼è·åè¡ä¹±æä½åæ°å¢ç对象ï¼ç¶ååæè¿äºæ°å¢ç对象ã
DDMSä½ç¨:æåå æ件ï¼ä¸»å¨è§¦åGCãï¼å ¶å®ä¹æ¯å¯ä»¥ç¨Android Studio çProfileéé¢çMemoryå·¥å ·æ¥æåå æ件çï¼ä½æ¯æè¿è¾¹å¨å©ç¨Profile 主å¨è§¦ågc çæ¶åä¼å¯¼è´ç¨åºå¥æºï¼ä¹ä¸ç¥éæ¯ä¸æ¯ææºçé®é¢ï¼æ以没ç¨Android StudioçProfilerï¼
MATä½ç¨ï¼å¯¹å æ件è¿è¡å¯¹æ¯ï¼æ¾å°å¤åºç对象ï¼æ¾å°å¯¹è±¡ç强å¼ç¨è°ç¨é¾ã
以ä¸æ¯è¯¦ç»çè¿ç¨ï¼
æ¥éª¤1.æå¼DDMS,éæ©éè¦è°è¯çåºç¨ï¼æå¼åå§çé¢ï¼ç¹å»ä¸å¾çå¾æ ï¼Dump Hprof Fileï¼å è·åä¸æ¬¡å æ件ã
æ¥éª¤2.对åºç¨é便æä½åï¼åå°ä¸å¼å§ççé¢ï¼å å¤è§¦åå 次GC ï¼ç¹å»ä¸å¾çå¾æ (Cause Gc)æ¥ä¸»å¨è§¦åGC,ç¶åå次ç¹å» Dump Hprof File å¾æ æ¥è·åå æ件ã
æ¥éª¤3.éè¿Android Studio Profile æè DDMS dump çå æ件æ æ³å¨MAT æå¼ï¼éè¦åå©android sdkå ä¸çä¸ä¸ªå·¥å ·hprof-conv.exeæ¥è½¬æ¢ã
æ ¼å¼ä¸º hprof-conv æ§æ件路å¾å è¦è½¬æ¢çå称ï¼
ä¾å¦ï¼hprof-conv --_--_.hprof change.hprof
æ¥éª¤4.æ两份å æä»¶å¯¼å ¥MAT,ç¶åéæ©å ¶ä¸ç¬¬äºæ¬¡è·åçå æ件ï¼ç¹å» å¦å¾æ示ç Histogramæ¥çã
æ¥éª¤5.ç¹å»ä¸å¾å¾æ ï¼Compare To Another Heap Dump ,éæ©å¦ä¸ä»½å æ件ã
6.ä¼å¾åºä¸å¾æ示ç Hitogram å±ç¤ºï¼æ们主è¦çObjects è¿ä¸åã å¦ä¸å¾æ示 â+ 2â å代表åé¢ä¸¤ä»½å æ件对æ¯ï¼è¿ä¸ªå¯¹è±¡å¤äºä¸¤ä¸ªï¼æ们主è¦å°±æ¯è¦åæè¿äºå¤äºåºæ¥ï¼æ²¡æ被åæ¶ç对象ã
7.å å ¥æ们ä»å¢å ç对象ä¸ï¼çå°äºMainActivity ï¼åéè¦ä»ä¸å¼å§æå¼çHitogram å±ç¤ºéé¢æ¾å°è¿ä¸ªå¯¹è±¡çè°ç¨æ ãå¦ä¸å¾æ示ï¼æç´¢MainActivity
8.çå°ä¸å¾æ示解éï¼ç¶åé¼ æ å³é®ç¹å»ä¸å¾çº¢è²ååççMainActivity ,éæ© Merger Shortest Paths to Gc Roots ï¼åéæ© exclude all phantom/weak/soft etc.references ,å°±å¯ä»¥çå°è¿ä¸ªMainActivity 对象ç强å¼ç¨é¾ï¼è³æ¤æ们就å¯ä»¥æ¾å°MainActivity对象æ¯è¢«ä»ä¹å¼ç¨å¯¼è´æ æ³åæ¶äºã
3ãå åæ³é²æ£æµç¥å¨ä¹LeakCanaryï¼çº¿ä¸éæï¼
èªè¡å¦ä¹ äºè§£ï¼æ¥å ¥ç®åï¼ä½¿ç¨ç®åï¼åºæ¬å¯ä»¥è§£å³å¤§é¨åå åæ³æ¼é®é¢ã
githubå°åï¼ /square/leakcanary/
å¦ä¹ å°åï¼ https://square.github.io/leakcanary/changelog/#version----
é对å åæå¨ç建议ï¼
é对å åæ³æ¼é®é¢ç建议ï¼
é对å å溢åºé®é¢ç建议ï¼ä¸»è¦å°±æ¯è¦åå°å åå ç¨ï¼ï¼
建议åèï¼
æ·±å ¥æ¢ç´¢ Android å åä¼åï¼ç¼ç±çº§å«ï¼
å¯¹äº ä¼åç大æ¹åï¼æ们åºè¯¥ä¼å å»åè§æå¿«çå°æ¹ï¼ä¸»è¦æ以ä¸ä¸é¨åï¼å åæ³æ¼ãå åæå¨ãBitmapãå®åçæ§æºå¶ä¹æ¯æ们çéç¹ï¼è½å¸®å©æ们对å åé®é¢å¿«éåæåå¤çã
åèï¼
æ·±å ¥æ¢ç´¢ Android å åä¼åï¼ç¼ç±çº§å«ï¼