ʲôÊÇÄÚ´æÐ¹Â©
¶ÔÓÚ²»Í¬µÄÓïÑÔÆ½Ì¨À´Ëµ£¬½øÐбê¼Ç»ØÊÕÄÚ´æµÄËã·¨ÊDz»Ò»ÑùµÄ£¬Ïñ Android£¨Java£©Ôò²ÉÓà GC-Root
µÄ±ê¼Ç»ØÊÕËã·¨¡£ÏÂÃæÕâÕÅͼ¾ÍչʾÁË Android ÄÚ´æµÄ»ØÊÕ¹ÜÀí²ßÂÔ£¨Í¼À´×ÔGoogle 2011µÄIO´ó»á£©

ͼÖеÄÿ¸öÔ²½Úµã´ú±í¶ÔÏóµÄÄÚ´æ×ÊÔ´£¬¼ýÍ·´ú±í¿É´ï·¾¶¡£µ±Ô²½ÚµãÓë GC Roots ´æÔÚ¿É´ï·¾¶Ê±£¬±íʾµ±Ç°×ÊÔ´Õý±»ÒýÓã¬ÐéÄâ»úÊÇÎÞ·¨¶ÔÆä½øÐлØÊյģ¨ÈçͼÖеĻÆÉ«½Úµã£©¡£·´¹ýÀ´£¬Èç¹ûÔ²½ÚµãÓë
GC Roots ²»´æÔÚ¿É´ï·¾¶£¬ÔòÒâζ×ÅÕâ¿é¶ÔÏóµÄÄÚ´æ×ÊÔ´²»ÔÙ±»³ÌÐòÒýÓã¬ÏµÍ³ÐéÄâ»ú¿ÉÒÔÔÚ GC ¹ý³ÌÖн«Æä»ØÊÕµô¡£
ÓÐÁËÉÏÃæµÄÄÚ´æ»ØÊÕµÄÀõ×Ó£¬ÄÇô½ÓÏÂÀ´¾Í¿ÉÒÔ˵˵ʲôÊÇÄÚ´æÐ¹Â©ÁË¡£´Ó¶¨ÒåÉϽ²£¬Android£¨Java£©Æ½Ì¨µÄÄÚ´æÐ¹Â©ÊÇָûÓÐÓõĶÔÏó×ÊÔ´ÈÎÓëGC-Root±£³Ö¿É´ï·¾¶£¬µ¼ÖÂϵͳÎÞ·¨½øÐлØÊÕ¡£¾ÙÒ»¸ö×î¼òµ¥µÄÀõ×Ó£¬ÎÒÃÇÔÚ
Activity µÄ onCreate º¯ÊýÖÐ×¢²áÒ»¸ö¹ã²¥½ÓÊÕÕߣ¬µ«ÊÇÔÚ onDestory º¯ÊýÖв¢Ã»ÓÐÖ´Ðз´×¢²á£¬µ±
Activity ±» finish µôʱ£¬Activity ¶ÔÏóÒѾ×ßÍêÁË×ÔÉíµÄÉúÃüÖÜÆÚ£¬Ó¦¸Ã±»×ÊÔ´»ØÊÕÊͷŵô£¬µ«ÓÉÓÚûÓз´×¢²á£¬
´Ëʱ Activity ºÍ GC-Root ¼äÈÎÈ»Óпɴï·¾¶´æÔÚ£¬µ¼Ö Activity ËäÈ»±»Ïú»Ù£¬µ«ÊÇËùÕ¼ÓõÄÄÚ´æ×ÊÔ´È´ÎÞ·¨±»»ØÊÕµô¡£ÀàËÆµÄÀõ×ÓÆäʵÓкܶ࣬²»Ò»Ò»Àý¾ÙÁË¡£¶ÔÓÚ
Android£¨Java£©ÄÚ´æ»ØÊÕ¹ÜÀíÏëÒªÔÙÉîÈëÁ˽âµÄͯЬ£¬¿ÉÒÔ¿´¿´ÏÂÃæ×ÊÔ´£º
ÉîÈëÀí½âJavaÐéÄâ»ú:JVM¸ß¼¶ÌØÐÔÓë×î¼Ñʵ¼ù(µÚ2°æ)
Google IO 2011 Memory management for Android Apps
й©µÄÔ´Í·
Á˽âÍêÄÚ´æÐ¹Â©µÄÀíÂÛ֪ʶºó£¬ÔÙÀ´¹éÀàÒ»ÏÂÄÚ´æÐ¹Â©µÄÔ´Í·¡£ÕâÀïÎÒ½«Æä¹éλÒÔÏÂÈýÀࣺ
×ÔÉí±àÂëÒýÆð
ÓÉÏîÄ¿¿ª·¢ÈËÔ±×ÔÉíµÄ±àÂëÔì³É¡£
µÚÈý·½´úÂëÒýÆð
ÕâÀïµÄµÚÈý·½´úÂë°üº¬Á½ÀࣺµÚÈý·½·Ç¿ªÔ´µÄSDKºÍ¿ªÔ´µÄµÚÈý·½¿ò¼Ü¡£
ϵͳÔÒò
ÓÉ Android ϵͳ×ÔÉíÔì³ÉµÄй©£¬ÈçÏñ WebView ¡¢ InputMethodManager
µÈÒýÆðµÄÎÊÌ⣬»¹ÓÐijЩµÚÈý·½ ROM ´æÔÚµÄÎÊÌâ¡£
й©µÄ¶¨Î»
ÄÚ´æÐ¹Â©²»ÏñÉÁÍ˵ÄBUG£¬ÅŲéÆðÀ´Ïà¶ÔÒª±È½ÏÀ§ÄÑЩ£¬±È½Ï¼«¶ËµÄÇé¿öÊǵ±ÄãµÄÓ¦Óà OOM Á˲ŷ¢ÏÖ´æÔÚÄÚ´æÐ¹Â©ÎÊÌ⣬µ½ÁËÕâÖÖÇé¿ö²ÅÈ¥ÅŲ鴦ÀíÎÊÌâµÄ»°£¬¶ÔÓû§µÄÓ°Ïì¾ÍÌ«´óÁË¡£Îª´Ë£¬ÎÒÃÇÄܹ»ÔÚ±àÂëÖо¡Ôç·¢ÏÖµ½ÎÊÌâ¾Í²»ÒªÍϵ½ÉÏÏßÖ®ºó²ÅÈ¥Ìî¿Ó£¬ÏÂÃæ½éÉÜһЩÎұȽϳ£ÓÃÅŲéÄÚ´æÐ¹Â©µÄ¹¤¾ß¡£
¾²Ì¬´úÂë·ÖÎö¹¤¾ß ¡ª¡ª Lint
Lint ÊÇ Android Studio ×Ô´øµÄ¹¤¾ß£¬Ê¹ÓÃ×ËÊÆºÜ¼òµ¥ Analyze -> Inspect
Code È»ºóÑ¡ÔñÏë񻃬̾µÄÇøÓò¼´¿É


¶Ô¿ÉÄÜÒýÆðй©µÄ±àÂ룬Lint ¶¼»á½øÐÐÎÂܰÌáʾ¡£

ÕâÀïÖ»ÊÇÅ×שÒýÓñµÄ½éÉÜ Lint £¬Êµ¼ÊÉÏÍæ·¨»¹Óкܶ࣬´ó¼Ò¿ÉÒÔ×ÔÐÐÍØÕ¹Ñ§Ï°¡£³ýÁË Lint Í⣬»¹ÓÐÏñ
FindBugs ¡¢ Checkstyle µÈ¾²Ì¬´úÂë·ÖÎö¹¤¾ßÒ²ÊǺܲ»´íµÄ¡£
ÑÏ¿Áģʽ ¡ª¡ª StrictMode
StrictMode ÊÇ Android ϵͳÌṩµÄ API £¬ÔÚ¿ª·¢»·¾³ÏÂÒýÈë¿ÉÒÔ¸üÔçµÄ±©Â¶·¢ÏÖÎÊÌâ¡£¹Ù·½ÎĵµÁ´½ÓÔÚÏÂÃæ£¨ÐèÒª¿ÆÑ§ÉÏÍø£©£º
https://developer.android.com/reference/android/os/StrictMode.html
ÒÔ¹ÙÍøµÄʾÀý´úÂëΪÀõ×Ó£¬Ò»°ã StrictMode Ö»ÔÚ²âÊÔ»·¾³ÏÂÆôÓ㬵½ÁËÉú²ú»·¾³¾Í»á½øÐйرգ¬Í¨³£ÎÒÃǶ¼»á½èÖú
BuildConfig.DEBUG À´ÊµÏÖ¡£

ÆôÓà StrictMode ºó£¬ÔÚ¹ýÂËÈÕÖ¾µÄµØ·½¼ÓÉÏ StrictMode µÄ¹ýÂË Tag £¬Èç¹ûÊÖ»úÁ¬½Ó×ŵçÄÔ½øÐпª·¢£¬¶¨ÆÚ¹Û²ìÒ»ÏÂ
StrictMode Õâ¸ö Tag ϵÄÈÕÖ¾£¬Ò»°ãÄã¿´µ½Ò»´ó¶ÑºìÉ«¸æ¾¯µÄ Log£¬¾ÍÐèÒªºÃºÃÅŲéÒ»ÏÂÊÇ·ñ¸úÄÚ´æÐ¹Â©ÓйØÁË¡£

LeakCanary

Square ¹«Ë¾³öÆ·µÄÄÚ´æ·ÖÎö¹¤¾ß£¬¹Ù·½µØÖ·ÈçÏ£º
https://github.com/square/leakcanary/
LeakCanary ºÍ StrictMode Ò»Ñù£¬ÐèÒªÔÚÏîÄ¿´úÂëÖм¯³É£¬²»¹ý´úÂëÒ²·Ç³£¼òµ¥£¬ÈçϵĹٷ½Ê¾Àý¡£

build.gradle ÒýÈ룬Application ÖмÓÈëÁ½ÈýÐдúÂ룬¼´¿É¸ã¶¨¡£ÒÔÉÏÖ»ÊǼòµ¥µÄÒýÈ룬»¹Óиü¶àʹÓÃ×ËÊÆ½¨ÒéÏêϸÔĶÁËüµÄ
Wiki Ï FAQ£º
https://github.com/square/leakcanary/wiki/FAQ
ÎÒ¶ÔʹÓà LeakCanary ÓÐÒÔÏÂÁ½µã¸ÐÊÜ£º
µ±ÄÚ´æÐ¹Â©·¢Éúʱ£¬LeakCanary »áµ¯´°Ìáʾ²¢Éú³É¶ÔÓ¦µÄ¶Ñ´æ´¢ÐÅÏ¢¼Ç¼£¬ÕâÈÃÎÒÃǶÔÒþ±ÎµÄÄÚ´æÐ¹Â©ÎÊÌâÓÐÁ˸ü¼ÓÖ±¹ÛµÄ¸Ð¾õ£¬µ«´Óʵ¼ÊʹÓÃÀ´¿´£¬LeakCanary
µÄÿ¸öÌáʾҲ²¢·ÇÊÇÕæÕý´æÔÚÄÚ´æÐ¹Â©ÎÊÌ⣬ҪÏëÈ·¶¨ÊÇ·ñ´æÔÚÎÊÌâÎÒÃÇ»¹ÐèÒª½èÖú MAT À´½øÐÐ×îºóµÄÈ·¶¨¡£
Android ϵͳ±¾Éí¾Í´æÔÚһЩÎÊÌâµ¼ÖÂÓ¦ÓÃÄÚ´æÐ¹Â©£¬LeakCanary µÄ AndroidExcludedRefs
Àà°ïÖúÎÒÃÇ´¦ÀíÁ˲»ÉÙÕâÀàÎÊÌâ¡£
Android Memory Monitor
AndroidStudio ÌṩµÄ¹¤¾ß£¬ÓÃÓÚ¼à¿ØÓ¦ÓõÄÄÚ´æÊ¹ÓÃ״̬£¬ÔÚ¿ª·¢ÖÐÒ²ÊǷdz£ÊµÓõŤ¾ß£¬¿ÉÒÔÓÃÀ´´òÓ¡³öÄÚ´æµÄ״̬ÐÅÏ¢¡£

´òÓ¡»ñµÃµÄÄÚ´æÐÅÏ¢ÈçÏ£¬¿ÉÒÔͨ¹ýÓÒÉϽǵÄÂÌÉ«Èý½ÇÐΰ´Å¥È¥·ÖÎöй©µÄ Activity ºÍ Ò»Ð©ÖØ¸´µÄ×Ö·û´®£¬Ä¿Ç°Ö»Ö§³ÖÕâÁ½¸ö£¬Ï£Íû
Google ºóÃæÄܹ»¼ÓÈë¸ü¶à¿ÉÑ¡·ÖÎö¹æÔò

ͬÑù£¬ÕâÀïÒ²Ö»ÊÇÅ×שÒýÓñµÄ¼òµ¥½éÉÜ£¬¹ØÓÚËüµÄʹÓÃÔÚ¹Ù·½ÎĵµÒѾ˵µÃºÜÏêϸÁË£¬ÐèÒªµÄͯЬ×ÔÐв鿴Ï·½Á´½Ó£¨Ðè¿ÆÑ§ÉÏÍø£©£º
https://developer.android.com/studio/profile/am-hprof.html
Memory Analyzer (MAT)
ÀÏÅÆ×Ó·ÖÎö¹¤¾ß£¬¿ÉÒÔ´Ó http://www.eclipse.org/mat/ ÏÂÔØ»ñµÃ£¬ÍøÉϹØÓÚ MAT
ʹÓõÄÎÄÕºö࣬´ó¼Ò¿ÉÒÔ×ÔÐвéÕÒ¡£ÉÏÃæµÄ Android Memory Monitor Éú³ÉµÄ¶Ô´¢´æÐÅÏ¢Îļþ¿ÉÒÔÅäÖÃ
MAT Ò»ÆðÀ´·ÖÎöʹÓã¬ÓÉÓÚ Android Memory Monitor Éú³ÉµÄ hprof Îļþ²»ÊDZê×¼¸ñʽ£¬ËùÒÔÐèÒª×öÒ»ÏÂת»»£¬È»ºóµ¼Èë
MAT

È»ºóͨ¹ý OQL Ïȶ¨Î»³öй©µÄ¶ÔÏó

ͨ¹ýÅųý³ýÁËÇ¿ÒýÓÃÖ®ÍâµÄÆäËûÒýÓÃÁ´£¬×îºó·ÖÎöµ½ GC Root µÄλÖÃ

MAT ʹÓÃÆðÀ´Ïà¶Ô·±Ëö£¬µ«²»Ê§Îª¶¨Î»¸ùÔ´ÎÊÌâµÄÀûÆ÷¡£
adb shell ÃüÁî
ʹÓà adb shell dumpsys meminfo [PackageName]£¬¿ÉÒÔ´òÓ¡³öÖ¸¶¨°üÃûµÄÓ¦ÓÃÄÚ´æÐÅÏ¢

ʹÓøÃÃüÁî¿ÉÒÔºÜÖ±¹ÛµÄ¹Û²ìµ½ Activity µÄй©ÎÊÌ⣬ÊÇÎÒÆ½³£·ÖÎö±È½Ï³£ÓõÄÒ»ÖÖ·½Ê½¡£³ýÁËʹÓÃÃüÁîÍ⣬AndroidStudio
Ò²ÌṩÁËÏÂÃæµÄ¹¦ÄÜ£¬ºÍʹÓÃÃüÁîÊÇÒ»ÑùЧ¹ûµÄ¡£

Èç¹û¶Ô adb shell ÃüÁî¸ÐÐËȤ£¬¸ü¶àµÄÐÅÏ¢¿ÉÒÔ¿´ÏÂÃæÌṩµÄ×ÊÔ´£º
http://adbshell.com/
https://github.com/mzlogin/awesome-adb
ÒÔÉϾÍÊÇÎÒÔÚ×öÄÚ´æÐ¹Â©·ÖÎöµÄʱºò»áÓõ½µÄ¹¤¾ß£¬Í¨³£¶¼ÊǽáºÏÆðÀ´Ó㬱Ͼ¹Ã¿¸ö¹¤¾ß¶¼ÓÐÓÅȱµã£¬Í¨¹ýʹÓöà¸ö¹¤¾ß»¥²¹·ÖÎöÎÊÌâ¿ÉÒÔ¼«´óµÄÌá¸ßÎÒÃǵÄЧÂʺÍ×îÖÕÈ¡µÃµÄЧ¹û¡£
й©µÄ½â¾ö²ßÂÔ
ÁÄÍ깤¾ß£¬×îºóÀ´Ì¸Ì¸ÄÚ´æÐ¹Â©ÎÊÌâµÄ½â¾ö²ßÂÔ¡£ÎÒ°ÑËü×ܽáΪÒÔÏÂÈýµã£º
Íê³ÉÐèÇó¹¦ÄÜ¿ª·¢ºó£¬ÔÙÈ¥ÓÅ»¯ÄÚ´æÐ¹Â©ÎÊÌ⣻
й©ԴÓжദʱ£¬ºËÐŦÄܲúÉúµÄй©ÓÅÏÈ´¦Àí£¬Óû§Ê¹ÓÃÆµ·±µÄ¹¦ÄÜÒýÆðµÄй©ÓÅÏÈ´¦Àí£»
´¦Àíй©±ÜÃâÓ°ÏìÔÓеĴúÂëÂß¼£¬ÓÅ»¯¹ýºó×îºÃÄܹ»ÈòâÊÔͯЬ¹ýÒ»±éÏà¹ØµÄ¹¦ÄÜ£¬±ÜÃâÒýÈëδ֪µÄBUG£»
×ܽá
¶ÔÓÚÈçºÎÔÚ±àÂëÉÏÈ¥½â¾öÄÚ´æÐ¹Â©ÎÊÌâ£¬ÍøÂçÉÏÓÐÌṩÁ˺ܶೡ¾°¼°Æä½â¾ö·½°¸£¬´ó¼Ò¿ÉÒÔ×ÔÐнèÖúËÑË÷ÒýÇæ¡£Í¨¹ýÕÆÎÕ·ÖÎö·½·¨ºÍ¶Ôй©³¡¾°¼°Æä½â¾ö·½°¸µÄ»ýÀÛ£¬ÏàÐÅ´ó¼Ò´¦ÀíÄÚ´æÐ¹Â©ÎÊÌâÊÇÓÎÈÐÓÐÓàµÄ¡£µ±È»£¬Ò²²¢²»ÊÇËùÓÐÄÚ´æÐ¹Â©ÎÊÌâÎÒÃǶ¼Äܹ»½øÐд¦Àí£¬¾ÍÀýÈçµÚ¶þÕ½ÚÌáµ½µÄй©ԴͷÊÇÓɵÚÈý·½´úÂëÒýÆðʱ£¬ÎÒÃǾÍÏÔµÃÎÞÄÜΪÁ¦ÁË¡£×î½üÔÚÅŲéµÄ¹ý³ÌÖоͷ¢ÏÖ²»ÉÙµÚÈý·½
SDK ´æÔÚй©ÎÊÌ⣬ÓöÉÏÕâÖÖÇé¿ö¾ÍµÃÕÒÕÒ¿ÉÌæ´úµÄ SDK ½øÐиü»»ÁË¡£ÒÔÉϾÍÊÇÎÒ×öÄÚ´æÐ¹Â©·ÖÎöµÄһЩÐĵÃ×ܽᣬÈç¹ûÓдíÎóºÍ²»×㣬»¹Çë´ó¼ÒÖ¸³ö¡£ |