ÔÚJavaÖУ¬ÄÚ´æµÄ·ÖÅäÊÇÓɳÌÐòÍê³ÉµÄ£¬¶øÄÚ´æµÄÊÍ·ÅÊÇÓÉÀ¬»øÊÕ¼¯Æ÷(Garbage
Collection£¬GC)Íê³ÉµÄ£¬³ÌÐòÔ±²»ÐèҪͨ¹ýµ÷Óú¯ÊýÀ´ÊÍ·ÅÄڴ棬µ«Ò²ËæÖ®´øÀ´ÁËÄÚ´æÐ¹Â©µÄ¿ÉÄÜ£¬ÉÏÆª²©¿Í£¬ÎÒ½éÉÜÁË
AndroidÐÔÄÜÓÅ»¯ÏµÁÐÖ®²¼¾ÖÓÅ»¯£¬±¾Æª²©¿Í£¬ÎÒ½«½éÉÜÄÚ´æÓÅ»¯µÄÏà¹ØÖªÊ¶¡£
ÄÚ´æµÄ·ÖÅä²ßÂÔ¸ÅÊö
³ÌÐòÔËÐÐʱµÄÄÚ´æ·ÖÅäÓÐÈýÖÖ²ßÂÔ,·Ö±ðÊǾ²Ì¬µÄ,ջʽµÄ,ºÍ¶ÑʽµÄ£¬¶ÔÓ¦µÄ£¬ÈýÖÖ´æ´¢²ßÂÔʹÓõÄÄÚ´æ¿Õ¼äÖ÷Òª·Ö±ðÊǾ²Ì¬´æ´¢Çø£¨Ò²³Æ·½·¨Çø£©¡¢¶ÑÇøºÍÕ»Çø¡£
¾²Ì¬´æ´¢Çø£¨·½·¨Çø£©£ºÄÚ´æÔÚ³ÌÐò±àÒëµÄʱºò¾ÍÒѾ·ÖÅäºÃ£¬Õâ¿éÄÚ´æÔÚ³ÌÐòÕû¸öÔËÐÐÆÚ¼ä¶¼´æÔÚ¡£ËüÖ÷Òª´æ·Å¾²Ì¬Êý¾Ý¡¢È«¾ÖstaticÊý¾ÝºÍ³£Á¿¡£
Õ»Çø£ºÔÚÖ´Ðк¯Êýʱ£¬º¯ÊýÄÚ¾Ö²¿±äÁ¿µÄ´æ´¢µ¥Ôª¶¼¿ÉÒÔÔÚÕ»ÉÏ´´½¨£¬º¯ÊýÖ´ÐнáÊøÊ±ÕâЩ´æ´¢µ¥Ôª×Ô¶¯±»ÊÍ·Å¡£Õ»ÄÚ´æ·ÖÅäÔËËãÄÚÖÃÓÚ´¦ÀíÆ÷µÄÖ¸ÁÖУ¬Ð§Âʺܸߣ¬µ«ÊÇ·ÖÅäµÄÄÚ´æÈÝÁ¿ÓÐÏÞ¡£
¶ÑÇø£ºÒà³Æ¶¯Ì¬ÄÚ´æ·ÖÅä¡£³ÌÐòÔÚÔËÐеÄʱºòÓÃmalloc»ònewÉêÇëÈÎÒâ´óСµÄÄڴ棬³ÌÐòÔ±×Ô¼º¸ºÔðÔÚÊʵ±µÄʱºòÓÃfree»òdeleteÊÍ·ÅÄڴ棨JavaÔòÒÀÀµÀ¬»ø»ØÊÕÆ÷£©¡£¶¯Ì¬ÄÚ´æµÄÉú´æÆÚ¿ÉÒÔÓÉÎÒÃǾö¶¨£¬Èç¹ûÎÒÃDz»ÊÍ·ÅÄڴ棬³ÌÐò½«ÔÚ×îºó²ÅÊͷŵô¶¯Ì¬ÄÚ´æ¡£
µ«ÊÇ£¬Á¼ºÃµÄ±à³Ìϰ¹ßÊÇ£ºÈç¹ûij¶¯Ì¬ÄÚ´æ²»ÔÙʹÓã¬ÐèÒª½«ÆäÊͷŵô¡£
¶ÑºÍÕ»µÄÇø±ð£º
ÔÚº¯ÊýÖУ¨ËµÃ÷ÊǾֲ¿±äÁ¿£©¶¨ÒåµÄһЩ»ù±¾ÀàÐ͵ıäÁ¿ºÍ¶ÔÏóµÄÒýÓñäÁ¿¶¼ÊÇÔÚº¯ÊýµÄÕ»ÄÚ´æÖзÖÅä¡£µ±ÔÚÒ»¶Î´úÂë¿éÖж¨ÒåÒ»¸ö±äÁ¿Ê±£¬java¾ÍÔÚÕ»ÖÐΪÕâ¸ö±äÁ¿·ÖÅäÄÚ´æ¿Õ¼ä£¬µ±³¬¹ý±äÁ¿µÄ×÷ÓÃÓòºó£¬java»á×Ô¶¯ÊͷŵôΪ¸Ã±äÁ¿·ÖÅäµÄÄÚ´æ¿Õ¼ä£¬¸ÃÄÚ´æ¿Õ¼ä¿ÉÒÔÁ¢¿Ì±»Áí×÷ËûÓá£
¶ÑÄÚ´æÓÃÓÚ´æ·ÅËùÓÐÓÉnew´´½¨µÄ¶ÔÏó£¨ÄÚÈݰüÀ¨¸Ã¶ÔÏóÆäÖеÄËùÓгÉÔ±±äÁ¿£©ºÍÊý×é¡£ÔÚ¶ÑÖзÖÅäµÄÄڴ棬ÓÉjavaÐéÄâ»ú×Ô¶¯À¬»ø»ØÊÕÆ÷À´¹ÜÀí¡£ÔÚ¶ÑÖвúÉúÁËÒ»¸öÊý×é»òÕß¶ÔÏóºó£¬»¹¿ÉÒÔÔÚÕ»Öж¨ÒåÒ»¸öÌØÊâµÄ±äÁ¿£¬Õâ¸ö±äÁ¿µÄȡֵµÈÓÚÊý×é»òÕß¶ÔÏóÔÚ¶ÑÄÚ´æÖеÄÊ×µØÖ·£¬ÔÚÕ»ÖеÄÕâ¸öÌØÊâµÄ±äÁ¿¾Í±ä³ÉÁËÊý×é»òÕß¶ÔÏóµÄÒýÓñäÁ¿£¬ÒÔºó¾Í¿ÉÒÔÔÚ³ÌÐòÖÐʹÓÃÕ»ÄÚ´æÖеÄÒýÓñäÁ¿À´·ÃÎʶÑÖеÄÊý×é»òÕß¶ÔÏó£¬ÒýÓñäÁ¿Ï൱ÓÚΪÊý×é»òÕß¶ÔÏóÆðµÄÒ»¸ö±ðÃû£¬»òÕß´úºÅ
¶ÑÊDz»Á¬ÐøµÄÄÚ´æÇøÓò£¨ÒòΪϵͳÊÇÓÃÁ´±íÀ´´æ´¢¿ÕÏÐÄÚ´æµØÖ·£¬×ÔÈ»²»ÊÇÁ¬ÐøµÄ£©£¬¶Ñ´óСÊÜÏÞÓÚ¼ÆËã»úϵͳÖÐÓÐЧµÄÐéÄâÄڴ棨32bitϵͳÀíÂÛÉÏÊÇ4G£©£¬ËùÒԶѵĿռä±È½ÏÁé»î£¬±È½Ï´ó¡£Õ»ÊÇÒ»¿éÁ¬ÐøµÄÄÚ´æÇøÓò£¬´óСÊDzÙ×÷ϵͳԤ¶¨ºÃµÄ£¬windowsÏÂÕ»´óСÊÇ2M£¨Ò²ÓÐÊÇ1M£¬ÔÚ±àÒëʱȷ¶¨£¬VCÖпÉÉèÖã©¡£
¶ÔÓÚ¶Ñ£¬Æµ·±µÄnew/delete»áÔì³É´óÁ¿ÄÚ´æË鯬£¬Ê¹³ÌÐòЧÂʽµµÍ¡£¶ÔÓÚÕ»£¬ËüÊÇÏȽøºó³öµÄ¶ÓÁУ¬½ø³öÒ»Ò»¶ÔÓ¦£¬²»²úÉúË鯬£¬ÔËÐÐЧÂÊÎȶ¨¸ß¡£

ËùÒÔÎÒÃÇ¿ÉÒԵóö½áÂÛ£º
1.¾Ö²¿±äÁ¿µÄ»ù±¾Êý¾ÝÀàÐͺÍÒýÓô洢ÓÚÕ»ÖУ¬ÒýÓõĶÔÏóʵÌå´æ´¢ÓÚ¶ÑÖС£ÒòΪËüÃÇÊôÓÚ·½·¨ÖеıäÁ¿£¬ÉúÃüÖÜÆÚËæ·½·¨¶ø½áÊø¡£
2.³ÉÔ±±äÁ¿È«²¿´æ´¢Óë¶ÑÖУ¨°üÀ¨»ù±¾Êý¾ÝÀàÐÍ£¬ÒýÓúÍÒýÓõĶÔÏóʵÌ壩£¬ÒòΪËüÃÇÊôÓÚÀ࣬Àà¶ÔÏóÖÕ¾¿ÊÇÒª±»new³öÀ´Ê¹Óõġ£
3.ÎÒÃÇËù˵µÄÄÚ´æÐ¹Â¶£¬Ö»Õë¶Ô¶ÑÄڴ棬ËûÃÇ´æ·ÅµÄ¾ÍÊÇÒýÓÃÖ¸ÏòµÄ¶ÔÏóʵÌå¡£
ÄÚ´æÐ¹Â¶²úÉúµÄÔÒò
ÔÚJavaÖУ¬ÄÚ´æµÄ·ÖÅäÊÇÓɳÌÐòÍê³ÉµÄ£¬¶øÄÚ´æµÄÊÍ·ÅÊÇÓÉÀ¬»øÊÕ¼¯Æ÷(Garbage
Collection£¬GC)Íê³ÉµÄ£¬³ÌÐòÔ±²»ÐèҪͨ¹ýµ÷Óú¯ÊýÀ´ÊÍ·ÅÄڴ棬µ«ËüÖ»ÄÜ»ØÊÕÎÞÓò¢ÇÒ²»ÔÙ±»ÆäËü¶ÔÏóÒýÓõÄÄÇЩ¶ÔÏóËùÕ¼ÓõĿռ䡣
JavaµÄÄÚ´æÀ¬»ø»ØÊÕ»úÖÆÊÇ´Ó³ÌÐòµÄÖ÷ÒªÔËÐжÔÏó(È羲̬¶ÔÏó/¼Ä´æÆ÷/Õ»ÉÏÖ¸ÏòµÄ¶ÑÄÚ´æ¶ÔÏóµÈ)¿ªÊ¼¼ì²éÒýÓÃÁ´£¬µ±±éÀúÒ»±éºóµÃµ½ÉÏÊöÕâЩÎÞ·¨»ØÊյĶÔÏóºÍËûÃÇËùÒýÓõĶÔÏóÁ´£¬×é³ÉÎÞ·¨»ØÊյĶÔÏ󼯺ϣ¬¶øÆäËû¹ÂÁ¢¶ÔÏ󣨼¯£©¾Í×÷ΪÀ¬»ø»ØÊÕ¡£GCΪÁËÄܹ»ÕýÈ·ÊͷŶÔÏ󣬱ØÐë¼à¿ØÃ¿Ò»¸ö¶ÔÏóµÄÔËÐÐ״̬£¬°üÀ¨¶ÔÏóµÄÉêÇë¡¢ÒýÓᢱ»ÒýÓᢸ³ÖµµÈ£¬GC¶¼ÐèÒª½øÐÐ¼à¿Ø¡£¼àÊÓ¶ÔÏó״̬ÊÇΪÁ˸ü¼Ó׼ȷµØ¡¢¼°Ê±µØÊͷŶÔÏ󣬶øÊͷŶÔÏóµÄ¸ù±¾ÔÔò¾ÍÊǸöÔÏó²»ÔÙ±»ÒýÓá£
ÔÚJavaÖУ¬ÕâЩÎÞÓõĶÔÏó¶¼ÓÉGC¸ºÔð»ØÊÕ£¬Òò´Ë³ÌÐòÔ±²»ÐèÒª¿¼ÂÇÕⲿ·ÖµÄÄÚ´æÐ¹Â¶¡£ËäÈ»£¬ÎÒÃÇÓм¸¸öº¯Êý¿ÉÒÔ·ÃÎÊGC£¬ÀýÈçÔËÐÐGCµÄº¯ÊýSystem.gc()£¬µ«ÊǸù¾ÝJavaÓïÑԹ淶¶¨Ò壬¸Ãº¯Êý²»±£Ö¤JVMµÄÀ¬»øÊÕ¼¯Æ÷Ò»¶¨»áÖ´ÐС£ÒòΪ²»Í¬µÄJVMʵÏÖÕß¿ÉÄÜʹÓò»Í¬µÄËã·¨¹ÜÀíGC¡£Í¨³£GCµÄÏ̵߳ÄÓÅÏȼ¶±ð½ÏµÍ¡£JVMµ÷ÓÃGCµÄ²ßÂÔÒ²ÓкܶàÖÖ£¬ÓеÄÊÇÄÚ´æÊ¹Óõ½´ïÒ»¶¨³Ì¶Èʱ£¬GC²Å¿ªÊ¼¹¤×÷£¬Ò²Óж¨Ê±Ö´Ðеģ¬ÓеÄÊÇÆ½»ºÖ´ÐÐGC£¬ÓеÄÊÇÖжÏʽִÐÐGC¡£µ«Í¨³£À´Ëµ£¬ÎÒÃDz»ÐèÒª¹ØÐÄÕâЩ¡£
µ«ÊÇÎÒÃÇÈÔÈ»¿ÉÒÔÈ¥¼àÌýϵͳµÄGC¹ý³Ì£¬ÒÔ´ËÀ´·ÖÎöÎÒÃÇÓ¦ÓóÌÐòµ±Ç°µÄÄÚ´æ×´Ì¬¡£ÄÇôÔõÑù²ÅÄÜÈ¥¼àÌýϵͳµÄGC¹ý³ÌÄØ£¿Æäʵ·Ç³£¼òµ¥£¬ÏµÍ³Ã¿½øÐÐÒ»´ÎGC²Ù×÷ʱ£¬¶¼»áÔÚLogCatÖдòÓ¡Ò»ÌõÈÕÖ¾£¬ÎÒÃÇֻҪȥ·ÖÎöÕâÌõÈÕÖ¾¾Í¿ÉÒÔÁË£¬ÈÕÖ¾µÄ»ù±¾¸ñʽÈçÏÂËùʾ£º
1.D/dalvikvm: <GC_Reason> <Amount_freed>, <Heap_stats>, <Pause_time> |
Ê×ÏȵÚÒ»²¿·ÖGC_Reason£¬Õâ¸öÊÇ´¥·¢Õâ´ÎGC²Ù×÷µÄÔÒò£¬Ò»°ãÇé¿öÏÂÒ»¹²ÓÐÒÔϼ¸ÖÖ´¥·¢GC²Ù×÷µÄÔÒò£º
GC_CONCURRENT: µ±ÎÒÃÇÓ¦ÓóÌÐòµÄ¶ÑÄÚ´æ¿ìÒªÂúµÄʱºò£¬ÏµÍ³»á×Ô¶¯´¥·¢GC²Ù×÷À´ÊÍ·ÅÄÚ´æ¡£
GC_FOR_MALLOC: µ±ÎÒÃǵÄÓ¦ÓóÌÐòÐèÒª·ÖÅä¸ü¶àÄڴ棬¿ÉÊÇÏÖÓÐÄÚ´æÒѾ²»×ãµÄʱºò£¬ÏµÍ³»á½øÐÐGC²Ù×÷À´ÊÍ·ÅÄÚ´æ¡£
GC_HPROF_DUMP_HEAP: µ±Éú³ÉHPROFÎļþµÄʱºò£¬ÏµÍ³»á½øÐÐGC²Ù×÷£¬¹ØÓÚHPROFÎļþÎÒÃÇÏÂÃæ»á½²µ½¡£
GC_EXPLICIT: ÕâÖÖÇé¿ö¾ÍÊÇÎÒÃǸղÅÌáµ½¹ýµÄ£¬Ö÷¶¯Í¨ÖªÏµÍ³È¥½øÐÐGC²Ù×÷£¬±ÈÈçµ÷ÓÃSystem.gc()·½·¨À´Í¨ÖªÏµÍ³¡£»òÕßÔÚDDMSÖУ¬Í¨¹ý¹¤¾ß°´Å¥Ò²ÊÇ¿ÉÒÔÏÔʽµØ¸æËßϵͳ½øÐÐGC²Ù×÷µÄ¡£
½ÓÏÂÀ´µÚ¶þ²¿·ÖAmount_freed£¬±íʾϵͳͨ¹ýÕâ´ÎGC²Ù×÷ÊÍ·ÅÁ˶àÉÙÄÚ´æ¡£
È»ºóHeap_statsÖлáÏÔʾµ±Ç°ÄÚ´æµÄ¿ÕÏбÈÀýÒÔ¼°Ê¹ÓÃÇé¿ö£¨»î¶¯¶ÔÏóËùÕ¼ÄÚ´æ
/ µ±Ç°³ÌÐò×ÜÄڴ棩¡£
×îºóPause_time±íʾÕâ´ÎGC²Ù×÷µ¼ÖÂÓ¦ÓóÌÐòÔÝÍ£µÄʱ¼ä¡£¹ØÓÚÕâ¸öÔÝÍ£µÄʱ¼ä£¬AndroidÔÚ2.3µÄ°æ±¾µ±ÖнøÐйýÒ»´ÎÓÅ»¯£¬ÔÚ2.3֮ǰGC²Ù×÷ÊDz»Äܲ¢·¢½øÐеģ¬Ò²¾ÍÊÇϵͳÕýÔÚ½øÐÐGC£¬ÄÇôӦÓóÌÐò¾ÍÖ»ÄÜ×èÈûסµÈ´ýGC½áÊø¡£Ëä˵Õâ¸ö×èÈûµÄ¹ý³Ì²¢²»»áºÜ³¤£¬Ò²¾ÍÊǼ¸°ÙºÁÃ룬µ«ÊÇÓû§ÔÚʹÓÃÎÒÃǵijÌÐòʱ»¹ÊÇÓпÉÄÜ»á¸Ð¾õµ½ÂÔ΢µÄ¿¨¶Ù¡£¶ø×Ô2.3Ö®ºó£¬GC²Ù×÷¸Ä³ÉÁ˲¢·¢µÄ·½Ê½½øÐУ¬¾ÍÊÇ˵GCµÄ¹ý³ÌÖв»»áÓ°Ïìµ½Ó¦ÓóÌÐòµÄÕý³£ÔËÐУ¬µ«ÊÇÔÚGC²Ù×÷µÄ¿ªÊ¼ºÍ½áÊøµÄʱºò»á¶ÌÔÝ×èÈûÒ»¶Îʱ¼ä£¬²»¹ýÓÅ»¯µ½ÕâÖ̶ֳȣ¬Óû§ÒѾÊÇÍêÈ«ÎÞ·¨²ì¾õµ½ÁË¡£
ÎÒÃÇÀ´¿´¿´JavaÖÐÐèÒª±»»ØÊÕµÄÀ¬»ø£º
£û Person p1 = new Person(); ¡¡ £ý |
ÒýÓþä±úp1µÄ×÷ÓÃÓòÊÇ´Ó¶¨Òåµ½¡°£ý¡±´¦£¬Ö´ÐÐÍêÕâ¶Ô´óÀ¨ºÅÖеÄËùÓдúÂëºó£¬²úÉúµÄPerson¶ÔÏó¾Í»á±ä³ÉÀ¬»ø£¬ÒòΪÒýÓÃÕâ¸ö¶ÔÏóµÄ¾ä±úp1Òѳ¬¹ýÆä×÷ÓÃÓò£¬p1ʧЧ£¬ÔÚÕ»Öб»Ïú»Ù£¬Òò´Ë¶ÑÉϵÄPerson¶ÔÏó²»ÔÙ±»Èκξä±úÒýÓÃÁË¡£
Òò´Ëperson±äΪÀ¬»ø£¬»á±»»ØÊÕ¡£
ÕâÀïÎÒÃÇÐèÒª½²ÊöÒ»¸ö¹Ø¼ü´Ê£ºÒýÓã¬Í¨¹ýAÄܵ÷Óò¢·ÃÎʵ½£Â£¬ÄǾÍ˵Ã÷£Á³ÖÓУµÄÒýÓ㬻òA¾ÍÊÇBµÄÒýÓ㬣µÄÒýÓüÆÊý£«£±.
£¨£±£©±ÈÈç Person p1 = new Person();ͨ¹ý£Ð£±ÄܲÙ×÷Person¶ÔÏó£¬Òò´Ë£Ð£±ÊÇPersonµÄÒýÓã»
£¨£²£©±ÈÈçÀàOÖÐÓÐÒ»¸ö³ÉÔ±±äÁ¿ÊÇIÀà¶ÔÏó£¬Òò´ËÎÒÃÇ¿ÉÒÔʹÓÃo.iµÄ·½Ê½À´·ÃÎÊIÀà¶ÔÏóµÄ³ÉÔ±£¬Òò´Ëo³ÖÓÐÒ»¸öi¶ÔÏóµÄÒýÓá£
GC¹ý³ÌÓë¶ÔÏóµÄÒýÓÃÀàÐÍÊÇÑÏÖØÏà¹ØµÄ£¬ÎÒÃÇÀ´¿´¿´Java¶ÔÒýÓõķÖÀàStrong
reference, SoftReference, WeakReference, PhatomReference

ÔÚAndroidÓ¦ÓõĿª·¢ÖУ¬ÎªÁË·ÀÖ¹ÄÚ´æÒç³ö£¬ÔÚ´¦ÀíһЩռÓÃÄÚ´æ´ó¶øÇÒÉùÃ÷ÖÜÆÚ½Ï³¤µÄ¶ÔÏóʱºò£¬¿ÉÒÔ¾¡Á¿Ó¦ÓÃÈíÒýÓúÍÈõÒýÓü¼Êõ¡£
Èí/ÈõÒýÓÿÉÒÔºÍÒ»¸öÒýÓöÓÁУ¨ReferenceQueue£©ÁªºÏʹÓã¬Èç¹ûÈíÒýÓÃËùÒýÓõĶÔÏó±»À¬»ø»ØÊÕÆ÷»ØÊÕ£¬JavaÐéÄâ»ú¾Í»á°ÑÕâ¸öÈíÒýÓüÓÈëµ½ÓëÖ®¹ØÁªµÄÒýÓöÓÁÐÖС£ÀûÓÃÕâ¸ö¶ÓÁпÉÒÔµÃÖª±»»ØÊÕµÄÈí/ÈõÒýÓõĶÔÏóÁÐ±í£¬´Ó¶øÎª»º³åÆ÷Çå³ýÒÑʧЧµÄÈí/ÈõÒýÓá£
¼ÙÉèÎÒÃǵÄÓ¦ÓûáÓõ½´óÁ¿µÄĬÈÏͼƬ£¬±ÈÈçÓ¦ÓÃÖÐÓÐĬÈϵÄÍ·Ïñ£¬Ä¬ÈÏÓÎϷͼ±êµÈµÈ£¬ÕâЩͼƬºÜ¶àµØ·½»áÓõ½¡£Èç¹ûÿ´Î¶¼È¥¶ÁȡͼƬ£¬ÓÉÓÚ¶ÁÈ¡ÎļþÐèÒªÓ²¼þ²Ù×÷£¬ËٶȽÏÂý£¬»áµ¼ÖÂÐÔÄܽϵ͡£ËùÒÔÎÒÃÇ¿¼Âǽ«Í¼Æ¬»º´æÆðÀ´£¬ÐèÒªµÄʱºòÖ±½Ó´ÓÄÚ´æÖжÁÈ¡¡£µ«ÊÇ£¬ÓÉÓÚͼƬռÓÃÄÚ´æ¿Õ¼ä±È½Ï´ó£¬»º´æºÜ¶àͼƬÐèÒªºÜ¶àµÄÄڴ棬¾Í¿ÉÄܱȽÏÈÝÒ×·¢ÉúOutOfMemoryÒì³£¡£Õâʱ£¬ÎÒÃÇ¿ÉÒÔ¿¼ÂÇʹÓÃÈí/ÈõÒýÓü¼ÊõÀ´±ÜÃâÕâ¸öÎÊÌâ·¢Éú¡£ÒÔϾÍÊǸßËÙ»º³åÆ÷µÄ³ûÐΣº
Ê×Ïȶ¨ÒåÒ»¸öHashMap£¬±£´æÈíÒýÓöÔÏó¡£
1.private Map<String, SoftReference<Bitmap>> imageCache = new HashMap<String, SoftReference<Bitmap>>(); 1
|
ÔÙÀ´¶¨ÒåÒ»¸ö·½·¨£¬±£´æBitmapµÄÈíÒýÓõ½HashMap
public class CacheSoftRef {
//Ê×Ïȶ¨ÒåÒ»¸öHashMap,±£´æÒýÓöÔÏó
private Map<String, SoftReference<Bitmap>>
imageCache = new HashMap<String, SoftReference<Bitmap>>();
//ÔÙÀ´¶¨ÒåÒ»¸ö·½·¨£¬±£´æBitmapµÄÈíÒýÓõ½HashMap
public void addBitmapToCache(String path) {
//Ç¿ÒýÓõÄBitmap¶ÔÏó
Bitmap bitmap = BitmapFactory.decodeFile(path);
//ÈíÒýÓõÄBitmap¶ÔÏó
SoftReference<Bitmap> softBitmap = new
SoftReference<Bitmap>(bitmap);
//Ìí¼Ó¸Ã¶ÔÏóµ½MapÖÐʹÆä»º´æ
imageCache.put(path, softBitmap);
}
//»ñÈ¡µÄʱºò£¬¿ÉÒÔͨ¹ýSoftReferenceµÄget()·½·¨µÃµ½Bitmap¶ÔÏó
public Bitmap getBitmapByPath(String path) {
//´Ó»º´æÖÐÈ¡ÈíÒýÓõÄBitmap¶ÔÏó
SoftReference<Bitmap> softBitmap = imageCache.get(path);
//ÅжÏÊÇ·ñ´æÔÚÈíÒýÓÃ
if (softBitmap == null) {
return null;
}
//ͨ¹ýÈíÒýÓÃÈ¡³öBitmap¶ÔÏó£¬Èç¹ûÓÉÓÚÄÚ´æ²»×ãBitmap±»»ØÊÕ£¬½«È¡µÃ¿Õ£¬Èç¹ûδ±»»ØÊÕ£¬
//Ôò¿ÉÖØ¸´Ê¹Óã¬Ìá¸ßËÙ¶È¡£
Bitmap bitmap = softBitmap.get();
return bitmap;
}
} |
ʹÓÃÈíÒýÓÃÒÔºó£¬ÔÚOutOfMemoryÒì³£·¢Éú֮ǰ£¬ÕâЩ»º´æµÄͼƬ×ÊÔ´µÄÄÚ´æ¿Õ¼ä¿ÉÒÔ±»ÊͷŵôµÄ£¬´Ó¶ø±ÜÃâÄÚ´æ´ïµ½ÉÏÏÞ£¬±ÜÃâCrash·¢Éú¡£
Èç¹ûÖ»ÊÇÏë±ÜÃâOutOfMemoryÒì³£µÄ·¢Éú£¬Ôò¿ÉÒÔʹÓÃÈíÒýÓá£Èç¹û¶ÔÓÚÓ¦ÓõÄÐÔÄܸüÔÚÒ⣬Ï뾡¿ì»ØÊÕһЩռÓÃÄÚ´æ±È½Ï´óµÄ¶ÔÏó£¬Ôò¿ÉÒÔʹÓÃÈõÒýÓá£
ÁíÍâ¿ÉÒÔ¸ù¾Ý¶ÔÏóÊÇ·ñ¾³£Ê¹ÓÃÀ´ÅжÏÑ¡ÔñÈíÒýÓû¹ÊÇÈõÒýÓá£Èç¹û¸Ã¶ÔÏó¿ÉÄܻᾳ£Ê¹Óõģ¬¾Í¾¡Á¿ÓÃÈíÒýÓá£Èç¹û¸Ã¶ÔÏó²»±»Ê¹ÓõĿÉÄÜÐÔ¸ü´óЩ£¬¾Í¿ÉÒÔÓÃÈõÒýÓá£
ËùÒÔÎÒÃǵóöÄÚ´æÐ¹Â©µÄÔÒò£º¶ÑÄÚ´æÖеij¤ÉúÃüÖÜÆÚµÄ¶ÔÏó³ÖÓжÌÉúÃüÖÜÆÚ¶ÔÏóµÄÇ¿/ÈíÒýÓ㬾¡¹Ü¶ÌÉúÃüÖÜÆÚ¶ÔÏóÒѾ²»ÔÙÐèÒª£¬µ«ÊÇÒòΪ³¤ÉúÃüÖÜÆÚ¶ÔÏó³ÖÓÐËüµÄÒýÓöøµ¼Ö²»Äܱ»»ØÊÕ£¬Õâ¾ÍÊÇJavaÖÐÄÚ´æÐ¹Â¶µÄ¸ù±¾ÔÒò¡£
ÄÚ´æÐ¹Â©µÄ¼ì²â
˵ÁËÄÇô¶à¹ØÓÚÄÚ´æ·ÖÅäµÄ֪ʶ£¬½ÓÏÂÀ´ÎÒÃǾͿ´¿´Android¸øÎÒÃÇÌṩÁËÄÄЩ¹¤¾ßÀ´½â¾öÄÚ´æÐ¹Â©µÄÎÊÌâ
Allocation Tracker(Device Monitor)
Allocation TrackerλÓÚAndroid Device
MonitorÖÐ

Allocation TrackerÃæ°å

¸÷Ãû³ÆµÄº¬ÒåÈçÏÂ:

Allocation Tracker²Ù×÷
1.Ê×ÏȽøÈëÄãҪ׷×ٵĽçÃæ
2.µã»÷Start Tracking°´Å¥£¬¿ªÊ¼¸ú×ÙÄÚ´æ·ÖÅä¹ì¼£
3.²Ù×÷ÄãµÄ½çÃæ£¬¾¡Á¿Ê±¼ä¶Ìµã
4.µã»÷Get Allocations°´Å¥£¬×¥È¥ÄÚ´æ·ÖÅä¹ì¼£ÐÅÏ¢£¬ÏÔʾÔÚÓұߵÄÃæ°åÖУ¬Ä¬ÈÏÒÔÄÚ´æ´óСÅÅÐò£¬Äã¿ÉÒÔÒÔ·ÖÅä˳ÐòÅÅÐò»òÕßÈÔÒÔÁÐÅÅÐò¡£
5.logcatÖлáÏÔʾ³öÕâ´ÎµÄ¹ì¼£¹²×¥µ½ÄÚ´æ·ÖÅä¹ì¼£¼Ç¼Êý£¬¿ÉÒÔ¼òµ¥µÄÀí½â·ÖÅäÁ˶àÉÙ´ÎÄڴ棬Õâ¸öÊýÖµºÍAlloc
orderµÄ×î´óÖµÊÇÏàµÈµÄ
6.Èç¹ûÄã²»Ïë¿´ÄÇô¶àÂÒÆß°ËÔãµÄ£¬Äã¿ÉÒÔʹÓÃFilterÀ´¹ýÂË£¬ÊäÈë°üÃû¾Í¿ÉÒÔÁË¡£
¸ú×ÙÄÚ´æ¹ì¼£
Èç¹ûÕâ¸öʱºòÎÒÃÇÏëµ¥¶À»ñȡij´Î²Ù×÷µÄÄÚ´æ¹ì¼££¬Ê×ÏÈÒ»¶¨Òª¼ÇµÃStop
TrackingÔÙStart Trackingһϣ¬ÈÃ×·×Ùµã³õʼ»¯Ò»Ï£¬È»ºó¾Í½øÐÐÎÒÃÇÐèÒª¹Û²ìÄÚ´æ±ä»¯µÄ²Ù×÷£¬È»ºóµã»÷Get
Allocations£¬Õâ¸öʱºòÎÒÃÇ´ÓÊ×Ò³½øÈëÒ»¸öÏêÇéÒ³,¿´Ò»ÏÂÎÒÃǵÄÄÚ´æ·ÖÅä¹ì¼££º

×·×Ùµ½µÄÄÚ´æ·ÖÅä20293´Î£¬¿´×ÅÊDz»ÊÇÓеãÎÞ´ÓÏÂÊÖ£¬Ã»¹ØÏµ£¬ÓÃFilter¹ýÂËÏÂ:

¹ýÂ˺󣬾ÍÊ£ÏÂÁ˸úÎÒÃÇAppÔ´ÂëÓйØÏµµÄ·ÖÅä¹ì¼££¬ÎÒÃÇËæ±ãÑ¡ÔñÒ»À¸£¬¿ÉÒÔ¿´µ½ÆätraceÐÅÏ¢:

ÉÏͼÖУ¬ÎÒÃÇ¿ÉÒÔ¿´³öÀ´£¬ÔÚµÚ635´ÎÄÚ´æ·ÖÅäÖУ¬·ÖÅäµÄÊÇIntroduceFragment¶ÔÏó£¬Õ¼ÓÃÄÚ´æ224×Ö½Ú£¬´¦ÀíÏß³ÌIdΪ3245£¬ÔÚjava.lang.ClassµÄnewInstance·½·¨ÖзÖÅäµÄ¡£´ÓtraceÐÅÏ¢¿ÉÒÔ¿´³öÀ´¸Ã·½·¨Ò»²½Ò»²½±»µ÷ÓõÄÐÅÏ¢¡£
DDMSµÄHeap Viewer
Heap ViewerÄÜ×öʲô£¿
ʵʱ²é¿´App·ÖÅäµÄÄÚ´æ´óСºÍ¿ÕÏÐÄÚ´æ´óС
·¢ÏÖMemory Leaks
ÔÚDevices ÖУ¬µã»÷Òª¼à¿ØµÄ³ÌÐò¡£
µã»÷DevicesÊÓͼ½çÃæÖÐ×îÉÏ·½Ò»ÅÅͼ±êÖеġ°Update Heap¡±
µã»÷HeapÊÓͼ
µã»÷HeapÊÓͼÖеġ°Cause GC¡±°´Å¥
µ½´ËΪֹÐè¼ì²âµÄ½ø³Ì¾Í¿ÉÒÔ±»¼àÊÓ¡£

°´ÉÏͼµÄ±ê¼Ç˳Ðò°´Ï£¬ÎÒÃǾÍÄÜ¿´µ½ÄÚ´æµÄ¾ßÌåÊý¾Ý£¬ÓÒ±ßÃæ°åÖÐÊýÖµ»áÔÚÿ´ÎGCʱ·¢Éú¸Ä±ä£¬°üÀ¨App×Ô¶¯´¥·¢»òÕßÄãÀ´ÊÖ¶¯´¥·¢¡£
ok£¬ÏÖÔÚÀ´½âÊÍÏÂÃæ°åÖеÄÃû´Ê
×ÜÀÀ

ÏêÇé



ÏÂÃæÊÇÿһ¸ö¶ÔÏó¶¼ÓеÄÁÐÃûº¬Ò壺

µ±ÎÒÃǵã»÷ijһÐÐʱ£¬¿ÉÒÔ¿´µ½ÈçϵÄÖù״ͼ£º

ºá×ø±êÊǶÔÏóµÄÄÚ´æ´óС£¬ÕâÐ©ÖµËæ×Ų»Í¬¶ÔÏóÊDz»Í¬µÄ£¬×Ý×ø±êÊÇÔÚij¸öÄÚ´æ´óСÉϵĶÔÏóµÄÊýÁ¿
Heap ViewerµÄʹÓÃ
ÎÒÃÇ˵Heap ViewerÊʺϷ¢ÏÖÄÚ´æÐ¹Â©µÄÎÊÌ⣬ÄÇôÈçºÎ¼ì²âÄØ£¿
ÄÇôÈçºÎ¼ì²âÄØ£¿
½øÈëijӦÓ㬲»¶ÏµÄ²Ù×÷¸ÃÓ¦Óã¬Í¬Ê±×¢Òâ¹Û²ìdata objectµÄTotal
SizeÖµ£¬Õý³£Çé¿öÏÂTotal SizeÖµ¶¼»áÎȶ¨ÔÚÒ»¸öÓÐÏ޵ķ¶Î§ÄÚ£¬Ò²¾ÍÊÇ˵ÓÉÓÚ³ÌÐòÖеĵĴúÂëÁ¼ºÃ£¬Ã»ÓÐÔì³É¶ÔÏó²»±»À¬»ø»ØÊÕµÄÇé¿ö¡£
ËùÒÔ˵ËäÈ»ÎÒÃDz»¶ÏµÄ²Ù×÷»á²»¶ÏµÄÉú³ÉºÜ¶à¶ÔÏ󣬶øÔÚÐéÄâ»ú²»¶ÏµÄ½øÐÐGCµÄ¹ý³ÌÖУ¬ÕâЩ¶ÔÏó¶¼±»»ØÊÕÁË£¬ÄÚ´æÕ¼ÓÃÁ¿»á»áÂäµ½Ò»¸öÎȶ¨µÄˮƽ£»·´Ö®Èç¹û´úÂëÖдæÔÚûÓÐÊͷŶÔÏóÒýÓõÄÇé¿ö£¬Ôòdata
objectµÄTotal SizeÖµÔÚÿ´ÎGCºó²»»áÓÐÃ÷ÏԵĻØÂä¡£Ëæ×ŲÙ×÷´ÎÊýµÄÔö¶àTotal SizeµÄÖµ»áÔ½À´Ô½´ó£¬Ö±µ½µ½´ïÒ»¸öÉÏÏÞºóµ¼Ö½ø³Ì±»É±µô¡£
MAT¹¤¾ß
ÄÇôͨ¹ýÉÏÃæDDMS¹¤¾ß£¬ÏÖÔÚÎÒÃÇÒѾ¿ÉÒԱȽÏÇáËɵط¢ÏÖÓ¦ÓóÌÐòÖÐÊÇ·ñ´æÔÚÄÚ´æÐ¹Â¶µÄÏÖÏóÁË¡£
ÎÒÃÇÓ¦¸ÃÔõô¶¨Î»µ½¾ßÌåÊÇÄÄÀï³öµÄÄÚ´æÐ¹Â¶ÄØ£¿Õâ¾ÍÐèÒª½èÖúÒ»¸öÄÚ´æ·ÖÎö¹¤¾ßÁË£¬½Ð×öEclipse
Memory Analyzer£¨MAT£©¡£ÏÂÔØµØÖ·ÊÇ£ºhttp://eclipse.org/mat/downloads.php¡£
ΪÁËʹÓøù¤¾ß£¬ÎÒÃÇÐèÒªhprofÎļþ¡£µ«ÊǸÃÎļþ²»ÄÜÖ±½Ó±»MATʹÓã¬ÐèÒª½øÐÐÒ»²½×ª»¯£¬¿ÉÒÔʹÓÃhprof-convÃüÁîÀ´×ª»¯£¬µ«ÊÇAndroid
Studio¿ÉÒÔÖ±½Óת»¯,ת»¯·½·¨ÈçÏ£º
1.Ñ¡ÔñÒ»¸öhprofÎļþ£¬µã»÷ÓÒ¼üÑ¡ÔñExport to standard
.hprofÑ¡Ïî¡£

2.Ìîд¸ü¸ÄºóµÄÎļþÃûºÍ·¾¶:

µã»÷OK°´Å¥ºó£¬MAT¹¤¾ßËùÐèµÄÎļþ¾ÍÉú³ÉÁË£¬ÏÂÃæÎÒÃÇÓÃMATÀ´´ò¿ª¸Ã¹¤¾ß:
1.´ò¿ªMATºóÑ¡ÔñFile->Open FileÑ¡ÔñÎÒÃǸղÅÉú³ÉµÄdoctorq.hprofÎļþ
2.Ñ¡Ôñ¸ÃÎļþºó£¬MAT»áÓм¸ÃëÖÖµÄʱ¼ä½âÎö¸ÃÎļþ£¬ÓеÄhprofÎļþ¿ÉÄܹý´ó£¬»áÓиü³¤µÄʱ¼ä½âÎö£¬½âÎöºó£¬Õ¹ÏÖÔÚÎÒÃǵÄÃæÇ°µÄ½çÃæÈçÏÂ:

ÉÏͼ×îÖÐÑëµÄÄǸö±ý״ͼչʾÁË×î´óµÄ¼¸¸ö¶ÔÏóËùÕ¼ÄÚ´æµÄ±ÈÀý£¬ÕâÕÅͼÖÐÌṩµÄÄÚÈݲ¢²»¶à£¬ÎÒÃÇ¿ÉÒÔºöÂÔËü¡£ÔÚÕâ¸ö±ý״ͼµÄÏ·½¾ÍÓм¸¸ö·Ç³£ÓÐÓõŤ¾ßÁË£¬ÎÒÃÇÀ´Ñ§Ï°Ò»Ï¡£
Histogram¿ÉÒÔÁгöÄÚ´æÖÐÿ¸ö¶ÔÏóµÄÃû×Ö¡¢ÊýÁ¿ÒÔ¼°´óС¡£
Dominator Tree»á½«ËùÓÐÄÚ´æÖеĶÔÏó°´´óС½øÐÐÅÅÐò£¬²¢ÇÒÎÒÃÇ¿ÉÒÔ·ÖÎö¶ÔÏóÖ®¼äµÄÒýÓýṹ¡£
ÏÖÔÚµã»÷Dominator Tree£¬½á¹ûÈçÏÂͼËùʾ£º

Ê×ÏÈRetained Heap±íʾÕâ¸ö¶ÔÏóÒÔ¼°ËüËù³ÖÓÐµÄÆäËüÒýÓ㨰üÀ¨Ö±½ÓºÍ¼ä½Ó£©ËùÕ¼µÄ×ÜÄڴ棬Òò´Ë´ÓÉÏͼÖп´£¬Ç°Á½ÐеÄRetained
HeapÊÇ×î´óµÄ£¬ÎÒÃÇ·ÖÎöÄÚ´æÐ¹Â©Ê±£¬ÄÚ´æ×î´óµÄ¶ÔÏóÒ²ÊÇ×îÓ¦¸ÃÈ¥»³Òɵġ£
ÔÚÿһÐеÄ×î×ó±ß¶¼ÓÐÒ»¸öÎļþÐ͵Äͼ±ê£¬ÕâЩͼ±êÓеÄ×óϽǴøÓÐÒ»¸öµã£¬ÓеÄÔòûÓС£´øµãµÄ¶ÔÏó¾Í±íʾÊÇ¿ÉÒÔ±»GC
Roots·ÃÎʵ½µÄ£¬¿ÉÒÔ±»GC Root·ÃÎʵ½µÄ¶ÔÏó¶¼ÊÇÎÞ·¨±»»ØÊյġ£ÄÇôÕâ¾Í˵Ã÷ËùÓдøºìÉ«µÄ¶ÔÏó¶¼ÊÇй©µÄ¶ÔÏóÂ𣿵±È»²»ÊÇ£¬ÒòΪÓÐЩ¶ÔÏóϵͳÐèҪһֱʹÓ㬱¾À´¾Í²»Ó¦¸Ã±»»ØÊÕ¡£ÎÒÃÇ¿ÉÒÔ×¢Òâµ½£¬ÉÏͼµ±ÖÐËùÓдøµãµÄ¶ÔÏó×îÓұ߶¼ÓÐдһ¸öSystem
Class£¬ËµÃ÷ÕâÊÇÒ»¸öÓÉϵͳ¹ÜÀíµÄ¶ÔÏ󣬲¢²»ÊÇÓÉÎÒÃÇ×Ô¼º´´½¨²¢µ¼ÖÂÄÚ´æÐ¹Â©µÄ¶ÔÏó¡£
ÉÏͼµ±ÖУ¬³ýÁË´øÓÐSystem ClassµÄÐÐÖ®Í⣬×î´óµÄ¾ÍÊǵڶþÐеÄBitmap¶ÔÏóÁË£¬ËäÈ»Bitmap¶ÔÏóÏÖÔÚ²»Äܱ»GC
Roots·ÃÎʵ½£¬µ«²»´ú±í×ÅBitmapËù³ÖÓÐµÄÆäËüÒýÓÃÒ²²»»á±»GC Roots·ÃÎʵ½¡£ÏÖÔÚÎÒÃÇ¿ÉÒÔ¶Ô×ŵڶþÐеã»÷ÓÒ¼ü
-> Path to GC Roots -> exclude weak references£¬ÎªÊ²Ã´Ñ¡Ôñexclude
weak referencesÄØ£¿ÒòΪÈõÒýÓÃÊDz»»á×èÖ¹¶ÔÏó±»À¬»ø»ØÊÕÆ÷»ØÊյģ¬ËùÒÔÎÒÃÇÕâÀïÖ±½Ó°ÑËüÅųýµô
¿ÉÒÔ¿´µ½£¬Bitmap¶ÔÏó¾¹ý²ã²ãÒýÓÃÖ®ºó£¬µ½ÁËMainActivityLeakClassÕâ¸ö¶ÔÏó£¬È»ºóÔÚͼ±êµÄ×óϽÇÓиöµã£¬¾Í˵Ã÷ÔÚÕâÀï¿ÉÒÔ±»GCRoots·ÃÎʵ½ÁË£¬²¢ÇÒÕâÊÇÓÉÎÒÃÇ×Ô¼º´´½¨µÄThread£¬²¢²»ÊÇSystemClassÁË£¬ÄÇôÓÉÓÚMainActivityLeakClassÄܱ»GC
Roots·ÃÎʵ½µ¼Ö²»Äܱ»»ØÊÕ£¬µ¼ÖÂËüËù³ÖÓÐµÄÆäËüÒýÓÃÒ²ÎÞ·¨±»»ØÊÕÁË£¬°üÀ¨MainActivity£¬Ò²°üÀ¨MainActivityÖÐËù°üº¬µÄͼƬ¡£
ͨ¹ýÕâÖÖ·½Ê½£¬ÎÒÃǾͳɹ¦µØ½«ÄÚ´æÐ¹Â©µÄÔÒòÕÒ³öÀ´ÁË¡£
HistogramµÄÓ÷¨
ÓõÄ×î¶àµÄ¹¦ÄÜÊÇ Histogram,µã»÷ ActionsÏ嵀 HistogramÏµÃµ½
Histogram½á¹û£º

Ëü°´ÀàÃû½«ËùÓеÄʵÀý¶ÔÏóÁгöÀ´£¬¿ÉÒÔµã»÷±íÍ·½øÐÐÅÅÐò,ÔÚ±íµÄµÚÒ»ÐпÉÒÔÊäÈëÕýÔò±í´ïʽÀ´Æ¥Åä½á¹û
:

ÔÚijһÏîÉÏÓÒ¼ü´ò¿ª²Ëµ¥Ñ¡Ôñ list objects ->with
incoming refs ½«Áгö¸ÃÀàµÄʵÀý£º

ËüչʾÁ˶ÔÏó¼äµÄÒýÓùØÏµ£¬±ÈÈçÕ¹¿ªºóµÄµÚÒ»¸ö×ÓÏî±íʾÕâ¸ö HomePage(0x420ca5b0)±»HomePageContainer(0x420c9e40)ÖеÄ
mHomePageÊôÐÔËùÒýÓÃ.
¿ìËÙÕÒ³öij¸öʵÀýû±»ÊͷŵÄÔÒò£¬¿ÉÒÔÓÒ½¡ Path to GC Roots¨C>exclue
all phantom/weak/soft etc. reference :

µÃµ½µÄ½á¹ûÊÇ£º

´Ó±íÖпÉÒÔ¿´³ö PreferenceManager -> ¡
->HomePageÕâÌõÏß·¾ÍÒýÓÃ×ÅÕâ¸ö HomePageʵÀý¡£ÓÃÕâ¸ö·½·¨¿ÉÒÔ¿ìËÙÕÒµ½Ä³¸ö¶ÔÏóµÄ
GC Root,Ò»¸ö´æÔÚ GC RootµÄ¶ÔÏóÊDz»»á±» GC»ØÊÕµôµÄ.
Histogram ¶Ô±È
Ϊ²éÕÒÄÚ´æÐ¹Â©£¬Í¨³£ÐèÒªÁ½¸ö Dump½á¹û×÷¶Ô±È£¬´ò¿ª Navigator
HistoryÃæ°å£¬½«Á½¸ö±íµÄ Histogram½á¹û¶¼Ìí¼Óµ½ Compare BasketÖÐÈ¥ :

Ìí¼ÓºÃºó£¬´ò¿ª Compare BasketÃæ°å£¬µÃµ½½á¹û£º

µã»÷ÓÒÉÏ½ÇµÄ ! °´Å¥£¬½«µÃµ½±È¶Ô½á¹û£º

×¢Ò⣬ÉÏÃæÕâ¸ö¶Ô±È½á¹û²»ÀûÓÚ²éÕÒ²îÒ죬¿ÉÒÔµ÷Õû¶Ô±ÈÑ¡Ï

ÔٰѶԱȵĽá¹ûÅÅÐò£¬¾Í¿ÉµÃµ½Ö±¹ÛµÄ¶Ô±È½á¹û£º

Ò²¿ÉÒÔ¶Ô±ÈÁ½¸ö¶ÔÏ󼯺ϣ¬·½·¨Óë´ËÀàËÆ£¬¶¼Êǽ«Á½¸ö Dump½á¹ûÖеĶÔÏ󼯺ÏÌí¼Óµ½Compare
BasketÖÐÈ¥¶Ô±È¡£ÕÒ³ö²îÒìºóÓà Histogram²éѯµÄ·½·¨ÕÒ³ö GC Root£¬¶¨Î»µ½¾ßÌåµÄij¸ö¶ÔÏóÉÏ¡£
LeakCanary
ÓбðÓÚMATºÍAndroidStudioÖÐMonitorsµÄʵʱÄÚ´æÕ¼ÓÃͼ£¬Ê¹ÓÃLeakCanary·ÖÎöÄÚ´æÐ¹Â¶¾Í¼òµ¥¶àÁËLeakCanaryÊÇSquare¿ªÔ´ÁËÒ»¸öÄÚ´æÐ¹Â¶×Ô¶¯Ì½²âÉñÆ÷
¡£ÕâÊÇÏîÄ¿µÄgithub²Ö¿âµØÖ·£ºhttps://github.com/square/leakcanary
¡£Ê¹Ó÷dz£¼òµ¥£¬ÔÚbuild.gradleÖÐÒýÈë°üÒÀÀµ£º
debugCompile 'com.squareup.leakcanary:leakcanary- android:1.5' releaseCompile 'com.squareup.leakcanary:leakcanary- android-no-op:1.5' testCompile 'com.squareup.leakcanary:leakcanary- android-no-op:1.5' ÔÚApplicationÖеÄonCreate·½·¨ÖÐÔö¼Ó³õʼ»¯´úÂ룺 if (LeakCanary.isInAnalyzerProcess(this)) { // This process is dedicated to LeakCanary for // heap analysis. // You should not init your app in this process. return; } LeakCanary.install(this); |
¼¯³Éºóʲô¶¼²»ÓÃ×ö£¬°´ÕÕÕý³£²âÊÔ£¬µ±ÓÐÄÚ´æÐ¹Â©·¢Éúºó£¬Ó¦Óûáͨ¹ýϵͳ֪ͨÀ¸·¢³ö֪ͨ£¬µã»÷֪ͨ¾Í¿ÉÒÔ½øÈë²é¿´ÄÚ´æÐ¹Â©µÄ¾ßÌåÐÅÏ¢¡£ÔÚÕâÀï¾Ù¸öʵ¼ùÖеÄÀý×Ó¡£°ÑLeakCanary¼¯³Éµ½ÏîÄ¿Öк󣬵ÈAppÆô¶¯ºóÒ»»á£¬ÏµÍ³Í¨Öªµ½ÁË£¬µã»÷֪ͨ£¬Ìø×ªµ½Ð¹Â©µÄÏêÇéÒ³Ãæ½øÐв鿴£º

ºÜÃ÷ÏÔ£¬WebSiteQueryActivityй¶ÁË¡£Ê×ÏÈ£¬static
µÄMaskHeadView.fLayout±äÁ¿ÒýÓÃÁËFrameLayout.mContext¶ÔÏó£¬Õâ¸ö¶ÔÏóµÄÒýÓþÍÊÇÖ¸ÏòÁËWebSiteQueryActivityµÄʵÀý£¬µ¼ÖÂÁËËüµÄй©£¬ÔÚµÚ¶þ½ÚÖÐÎÒÃÇ˵¹ýstatic¶ÔÏóÊÇÄÚ²¿µÄstatic¶ÔÏóÊDZȽÏÈÝÒ×Ôì³ÉÄÚ´æÐ¹Â©µÄ£¬¼ì²é´úÂë·¢ÏÖ£¬MaskHeadViewÖ±½ÓÔÚWebSiteQueryActivityµÄxmlÎļþÖÐʹÓÃÁË£¬Òò´Ë³ÖÓÐWebSiteQueryActivityµÄʵÀý£¬ÒòΪfLayout¶ÔÏóÊǾ²Ì¬µÄ£¬Òò´ËËüµÄÉúÃüÖÜÆÚÓëApplicationͬÑù³¤£¬Òò´ËWebSiteQueryActivityÍ˳öºó£¬ËüµÄʵÀýÒýÓÃÒÀÈ»±»fLayout³ÖÓУ¬µ¼ÖÂËüÎÞ·¨±»»ØÊÕ´Ó¶øÄÚ´æÐ¹Â¶ÁË¡£×Ðϸ¼ì²é´úÂ룬·¢ÏÖfLayout²¢Ã»Óб»ÍⲿʹÓõ½£¬Ó¦¸ÃÊÇ֮ǰµÄ¿ª·¢ÕßÊÖ¶¶¼ÓÁ˸östatic×Ö¶ÎÉÏÈ¥»òÕßÊÇÏÖÔÚ²»ÓÃÁË£¬µ«ÊÇûÓÐÈ¥µô£¬ÔÚÕâÀïÎÒÖ±½ÓÈ¥µôÁËÕâ¸öÐÞÊηû£¬ÔÚ´Ëbuild´úÂ룬Õâ¸öÄÚ´æÐ¹Â©µÄÏÖÏóÏûʧÁË¡£
//È¥µôstaticÐÞÊηû£¬±ÜÃâstatic¶ÔÏóÒýÆðµÄÄÚ´æÐ¹Â© private static FrameLayout fLayout;
public MaskHeadView(Context context, AttributeSet
attrs) {
super(context, attrs);
this.context=context;
initView(context);
}
private void initView(Context context2) {
view = LayoutInflater.from(context).inflate(R.layout.
mask_head_view, this);
fLayout=(FrameLayout) view.findViewById(R.id.
mask_container);
} |
ÕâÖ»ÊǸö¼«¼òµ¥µÄÀý×Ó£¬µ«·½·¨ÊÇÒ»ÑùµÄ¡£Ë³±ãÌáÒ»¾ä£¬ÆäʵÎÞÂÛÊÇMAT¹¤¾ßµÄÄÚ´æ·ÖÎö£¬»¹ÊÇAndroidStudioÖÐ×Ô´øµÄ·ÖÎö¹¤¾ßÒà»òÊÇLeakCanary£¬ÔÀí¶¼ÊÇÒ»ÑùµÄ£¬¶¼ÊÇdump
Java heap³öÀ´½øÐзÖÎö£¬ÕÒµ½Ð¹Â©µÄÎÊÌ⣬ֻÊÇLeakCanary°ïÎÒÃǰѷÖÎöµÄ¹¤×÷×öÁË¡£µ«ÖµµÃÒ»ÌáµÄÊÇ£¬LeakCanary²¢²»ÊÇÍòÄܵģ¬ÓÐЩÄÚ´æÐ¹Â©£¬ËüÒ²ÎÞ·¨¼ì²â³öÀ´¡£ |