Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
AndroidÄÚ´æÐ¹Â¶×ܽᣨ¸½ÄÚ´æ¼ì²â¹¤¾ß£©
 
×÷Õߣºanonymoussf  À´Ô´£ºsegmentfault ·¢²¼ÓÚ£º 2016-10-18
  2423  次浏览      32
 

Java ÖеÄÄÚ´æ·ÖÅä

Ö÷ÒªÊÇ·ÖÈý¿é£º

¾²Ì¬´¢´æÇø£º±àÒëʱ¾Í·ÖÅäºÃ£¬ÔÚ³ÌÐòÕû¸öÔËÐÐÆÚ¼ä¶¼´æÔÚ¡£ËüÖ÷Òª´æ·Å¾²Ì¬Êý¾ÝºÍ³£Á¿¡£

Õ»Çø£ºµ±·½·¨Ö´ÐÐʱ£¬»áÔÚÕ»ÇøÄÚ´æÖд´½¨·½·¨ÌåÄÚ²¿µÄ¾Ö²¿±äÁ¿£¬·½·¨½áÊøºó×Ô¶¯ÊÍ·ÅÄÚ´æ¡£

¶ÑÇø£ºÍ¨³£´æ·Å new ³öÀ´µÄ¶ÔÏó¡£ÓÉ Java À¬»ø»ØÊÕÆ÷»ØÊÕ¡£

Õ»Óë¶ÑµÄÇø±ð

Õ»ÄÚ´æÓÃÀ´´æ·Å¾Ö²¿±äÁ¿ºÍº¯Êý²ÎÊýµÈ¡£ËüÊÇÏȽøºó³öµÄ¶ÓÁУ¬½ø³öÒ»Ò»¶ÔÓ¦£¬²»²úÉúË鯬£¬ÔËÐÐЧÂÊÎȶ¨¸ß¡£µ±³¬¹ý±äÁ¿µÄ×÷ÓÃÓòºó£¬¸Ã±äÁ¿Ò²¾ÍÎÞЧÁË£¬·ÖÅ䏸ËüµÄÄÚ´æ¿Õ¼äÒ²½«±»Êͷŵô£¬¸ÃÄÚ´æ¿Õ¼ä¿ÉÒÔ±»ÖØÐÂʹÓá£

¶ÑÄÚ´æÓÃÓÚ´æ·Å¶ÔÏóʵÀý¡£ÔÚ¶ÑÖзÖÅäµÄÄڴ棬½«ÓÉJavaÀ¬»ø»ØÊÕÆ÷À´×Ô¶¯¹ÜÀí¡£ÔÚ¶ÑÄÚ´æÖÐÆµ·±µÄ new/delete »áÔì³É´óÁ¿ÄÚ´æË鯬£¬Ê¹³ÌÐòЧÂʽµµÍ¡£

¶ÔÓڷǾ²Ì¬±äÁ¿µÄ´¢´æÎ»Öã¬ÎÒÃÇ¿ÉÒÔ´Ö±©µÄÈÏΪ£º

¾Ö²¿±äÁ¿Î»ÓÚÕ»ÖÐ(ÆäÖÐÒýÓñäÁ¿Ö¸ÏòµÄ¶ÔÏóʵÌå´æÔÚÓÚ¶ÑÖÐ)¡£

³ÉÔ±±äÁ¿Î»ÓÚ¶ÑÖС£ÒòΪËüÃÇÊôÓÚÀ࣬¸ÃÀà×îÖÕ±»new³É¶ÔÏ󣬲¢×÷Ϊһ¸öÕûÌå´¢´æÔÚ¶ÑÖС£

ËÄÖÖÒýÓÃÀàÐ͵ĽéÉÜ

GC ÊͷŶÔÏóµÄ¸ù±¾Ô­ÔòÊǸöÔÏó²»ÔÙ±»ÒýÓÃ(Ç¿ÒýÓÃ)¡£ÄÇôʲôÊÇÇ¿ÒýÓÃÄØ?

Ç¿ÒýÓÃ(Strong Reference)

ÎÒÃÇÆ½³£ÓõÄ×î¶àµÄ¾ÍÊÇÇ¿ÒýÓã¬ÈçÏ£º

IPhotos iPhotos = new IPhotos(); 

JVM Äþ¿ÉÅ׳ö OOM £¬Ò²²»»áÈà GC »ØÊÕ¾ßÓÐÇ¿ÒýÓõĶÔÏó¡£Ç¿ÒýÓò»Ê¹ÓÃʱ£¬¿ÉÒÔͨ¹ý obj = null À´ÏÔʽµÄÉèÖøöÔÏóµÄËùÓÐÒýÓÃΪ null£¬ÕâÑù¾Í¿ÉÒÔ»ØÊոöÔÏóÁË¡£ÖÁÓÚʲôʱºò»ØÊÕ£¬È¡¾öÓÚ GC µÄËã·¨£¬ÕâÀï²»×öÉ¡£

ÈíÒýÓÃ(Soft Reference)

SoftReference<String> softReference = new SoftReference<>(str); 

Èç¹ûÒ»¸ö¶ÔÏóÖ»¾ßÓÐÈíÒýÓã¬ÄÇôÔÚÄÚ´æ¿Õ¼ä×㹻ʱ£¬À¬»ø»ØÊÕÆ÷¾Í²»»á»ØÊÕËü;Èç¹ûÄÚ´æ¿Õ¼ä²»×ãÁË£¬¾Í»á»ØÊÕÕâЩ¶ÔÏóµÄÄÚ´æ¡£Ö»ÒªÀ¬»ø»ØÊÕÆ÷ûÓлØÊÕËü£¬¸Ã¶ÔÏó¾Í¿ÉÒÔ±»Ê¹Óá£

ÈíÒýÓÃÔø¾­³£±»ÓÃÀ´×÷ͼƬ»º´æ£¬È»¶ø¹È¸èÏÖÔÚÍÆ¼öÓà LruCache Ìæ´ú£¬ÒòΪ LRU ¸ü¸ßЧ¡£

In the past, a popular memory cache implementation was a SoftReference

or WeakReference bitmap cache, however this is not recommended.

Starting from Android 2.3 (API Level 9) the garbage collector is more

aggressive with collecting soft/weak references which makes them

fairly ineffective. In addition, prior to Android 3.0 (API Level 11),

the backing data of a bitmap was stored in native memory which is not

released in a predictable manner, potentially causing an application

to briefly exceed its memory limits and crash. Ô­ÎÄ

´óÖÂÒâ˼ÊÇ£ºÒòΪÔÚ Android 2.3 ÒÔºó£¬GC »áºÜƵ·±£¬µ¼ÖÂÊÍ·ÅÈíÒýÓÃµÄÆµÂÊÒ²ºÜ¸ß£¬ÕâÑù»á½µµÍËüµÄʹÓÃЧÂÊ¡£²¢ÇÒ 3.0 ÒÔǰ Bitmap ÊÇ´æ·ÅÔÚ Native Memory ÖУ¬ËüµÄÊÍ·ÅÊDz»ÊÜ GC ¿ØÖƵģ¬ËùÒÔʹÓÃÈíÒýÓûº´æ Bitmap ¿ÉÄÜ»áÔì³É OOM¡£

ÈõÒýÓÃ(Weak Reference)

WeakReference<String> weakReference = new WeakReference<>(str); 

ÓëÈíÒýÓõÄÇø±ðÔÚÓÚ£ºÖ»¾ßÓÐÈõÒýÓõĶÔÏóÓµÓиü¶ÌÔݵÄÉúÃüÖÜÆÚ¡£ÒòΪÔÚ GC ʱ£¬Ò»µ©·¢ÏÖÁËÖ»¾ßÓÐÈõÒýÓõĶÔÏ󣬲»¹Üµ±Ç°ÄÚ´æ¿Õ¼ä×ã¹»Óë·ñ£¬¶¼»á»ØÊÕËüµÄÄÚ´æ¡£²»¹ý£¬ÓÉÓÚÀ¬»ø»ØÊÕÆ÷ÊÇÒ»¸öÓÅÏȼ¶ºÜµÍµÄỊ̈߳¬Òò´Ë²»Ò»¶¨»áºÜ¿ì·¢ÏÖÄÇЩֻ¾ßÓÐÈõÒýÓõĶÔÏó- -¡£

ÐéÒýÓÃ(PhantomReference)

¹ËÃû˼Ò壬¾ÍÊÇÐÎͬÐéÉ裬ÓëÆäËû¼¸ÖÖÒýÓö¼²»Í¬£¬ÐéÒýÓò¢²»»á¾ö¶¨¶ÔÏóµÄÉúÃüÖÜÆÚ£¬Ò²ÎÞ·¨Í¨¹ýÐéÒýÓûñµÃ¶ÔÏóʵÀý¡£ÐéÒýÓñØÐëºÍÒýÓöÓÁÐ(ReferenceQueue)ÁªºÏʹÓᣵ±À¬»ø»ØÊÕÆ÷×¼±¸»ØÊÕÒ»¸ö¶ÔÏóʱ£¬Èç¹û·¢ÏÖËü»¹ÓÐÐéÒýÓ㬾ͻáÔÚ»ØÊÕ¶ÔÏóµÄÄÚ´æÖ®Ç°£¬°ÑÕâ¸öÐéÒýÓüÓÈëµ½ÓëÖ®¹ØÁªµÄÒýÓöÓÁÐÖС£³ÌÐò¿ÉÒÔͨ¹ýÅжÏÒýÓöÓÁÐÖÐÊÇ·ñ´æÔڸöÔÏóµÄÐéÒýÓã¬À´Á˽âÕâ¸ö¶ÔÏóÊÇ·ñ½«Òª±»»ØÊÕ¡£

AndroidµÄÀ¬»ø»ØÊÕ»úÖÆ¼ò½é

Android ϵͳÀïÃæÓÐÒ»¸ö Generational Heap Memory Ä£ÐÍ£¬ÏµÍ³»á¸ù¾ÝÄÚ´æÖв»Í¬µÄÄÚ´æÊý¾ÝÀàÐÍ·Ö±ðÖ´Ðв»Í¬µÄ GC ²Ù×÷¡£

¸ÃÄ£ÐÍ·ÖΪÈý¸öÇø£º

Young Generation

1.eden

2.Survivor Space

1.S0

2.S1

Old Generation

Permanent Generation

Young Generation

´ó¶àÊý new ³öÀ´µÄ¶ÔÏ󶼷ŵ½ eden Çø£¬µ± eden ÇøÌîÂúʱ£¬Ö´ÐÐ Minor GC(ÇáÁ¿¼¶GC)£¬È»ºó´æ»îÏÂÀ´µÄ¶ÔÏó±»×ªÒƵ½ Survivor Çø(ÓÐ S0£¬S1 Á½¸ö)¡£ Minor GC Ò²»á¼ì²é Survivor ÇøµÄ¶ÔÏ󣬲¢°ÑËüÃÇ×ªÒÆµ½ÁíÒ»¸ö Survivor Çø£¬ÕâÑù¾Í×Ü»áÓÐÒ»¸ö Survivor ÇøÊǿյġ£

Old Generation

´æ·Å³¤ÆÚ´æ»îÏÂÀ´µÄ¶ÔÏó(¾­¹ý¶à´Î Minor GC ºóÈÔÈ»´æ»îÏÂÀ´µÄ¶ÔÏó) Old Generation ÇøÂúÁËÒÔºó£¬Ö´ÐÐ Major GC(´óÐÍ GC)¡£

ÔÚAndroid 2.2 ֮ǰ£¬Ö´ÐÐ GC ʱ£¬Ó¦ÓõÄÏ̻߳ᱻÔÝÍ££¬2.3 ¿ªÊ¼Ìí¼ÓÁ˲¢·¢À¬»ø»ØÊÕ»úÖÆ¡£

Permanent Generation

´æ·Å·½·¨Çø¡£Ò»°ã´æ·Å£º

Òª¼ÓÔØµÄÀàµÄÐÅÏ¢

¾²Ì¬±äÁ¿

final³£Á¿

ÊôÐÔ¡¢·½·¨ÐÅÏ¢

60 FPS

ÕâÀï¼òµ¥µÄ½éÉÜÒ»ÏÂÖ¡ÂʵĸÅÄÒÔ±ãÓÚÀí½âΪʲô´óÁ¿µÄ GC ÈÝÒ×ÒýÆð¿¨¶Ù¡£

App ¿ª·¢Ê±£¬Ò»°ã×·Çó½çÃæµÄÖ¡ÂÊ´ïµ½60 FPS(60 Ö¡/Ãë)£¬ÄÇÕâ¸ö FPS ÊÇʲô¸ÅÄîÄØ?

10-12 FPS ʱ¿ÉÒÔ¸ÐÊܵ½¶¯»­µÄЧ¹û;

24 FPS£¬¿ÉÒÔ¸ÐÊܵ½Æ½»¬Á¬¹áµÄ¶¯»­Ð§¹û£¬µçÓ°³£ÓÃÖ¡ÂÊ(²»×·Çó 60 FPS ÊǽÚÊ¡³É±¾);

60 FPS£¬´ïµ½×îÁ÷³©µÄЧ¹û£¬¶ÔÓÚ¸ü¸ßµÄFPS£¬´óÄÔÒѾ­ÄÑÒÔ²ì¾õÇø±ð¡£

Android ÿ¸ô 16 ms·¢³ö VSYNC Ðźţ¬´¥·¢¶Ô UI µÄäÖȾ(¼´Ã¿ 16 ms»æÖÆÒ»Ö¡)£¬Èç¹ûÕû¸ö¹ý³Ì±£³ÖÔÚ 16 msÒÔÄÚ£¬ÄÇô¾Í»á´ïµ½ 60 FPS µÄÁ÷³©»­Ãæ¡£³¬¹ýÁË 16 ms¾Í»áÔì³É¿¨¶Ù¡£ÄÇôÈç¹ûÔÚ UI äÖȾʱ·¢ÉúÁË´óÁ¿ GC£¬»òÕß GC ºÄʱ̫³¤£¬ÄÇô¾Í¿ÉÄܵ¼Ö»æÖƹý³Ì³¬¹ý 16 ms´Ó¶øÔì³É¿¨¶Ù(FPS Ͻµ¡¢µôÖ¡µÈ)£¬¶øÎÒÃÇ´óÄÔ¶ÔÓÚµôÖ¡µÄÇé¿öÊ®·ÖÃôÈñ£¬Òò´ËÈç¹ûûÓÐ×öºÃÄÚ´æ¹ÜÀí£¬½«»á¸øÓû§´øÀ´·Ç³£²»ºÃµÄÌåÑé¡£

ÔÙ½éÉÜÒ»ÏÂÄÚ´æ¶¶¶¯µÄ¸ÅÄ±¾ÎĺóÃæ¿ÉÄÜ»áÓõ½Õâ¸ö¸ÅÄî¡£

ÄÚ´æ¶¶¶¯

¶Ìʱ¼äÄÚ´óÁ¿ new ¶ÔÏ󣬴ﵽ Young Generation µÄãÐÖµºó´¥·¢GC£¬µ¼ÖÂ¸Õ new ³öÀ´µÄ¶ÔÏóÓÖ±»»ØÊÕ¡£´ËÏÖÏó»áÓ°ÏìÖ¡ÂÊ£¬Ôì³É¿¨¶Ù¡£

ÄÚ´æ¶¶¶¯ÔÚ Android ÌṩµÄ Memory Monitor Öдó¸Å±íÏÖΪÕâÑù£º

AndroidÖг£¼ûµÄÄÚ´æÐ¹Â¶¼°½â¾ö·½°¸

¼¯ºÏÀàй¶

Èç¹ûij¸ö¼¯ºÏÊÇÈ«¾ÖÐԵıäÁ¿(±ÈÈç static ÐÞÊÎ)£¬¼¯ºÏÄÚÖ±½Ó´æ·ÅһЩռÓôóÁ¿ÄÚ´æµÄ¶ÔÏó(¶ø²»ÊÇͨ¹ýÈõÒýÓôæ·Å)£¬ÄÇÃ´Ëæ×ż¯ºÏ size µÄÔö´ó£¬»áµ¼ÖÂÄÚ´æÕ¼Óò»¶ÏÉÏÉý£¬¶øÔÚ Activity µÈÏú»Ùʱ£¬¼¯ºÏÖеÄÕâЩ¶ÔÏóÎÞ·¨±»»ØÊÕ£¬µ¼ÖÂÄÚ´æÐ¹Â¶¡£±ÈÈçÎÒÃÇϲ»¶Í¨¹ý¾²Ì¬ HashMap ×öһЩ»º´æÖ®ÀàµÄÊ£¬ÕâÖÖÇé¿öҪСÐÄ£¬¼¯ºÏÄÚ¶ÔÏó½¨Òé²ÉÓÃÈõÒýÓõķ½Ê½´æÈ¡£¬²¢¿¼ÂÇÔÚ²»ÐèÒªµÄʱºòÊÖ¶¯ÊÍ·Å¡£

µ¥ÀýÔì³ÉµÄÄÚ´æÐ¹Â¶

µ¥ÀýµÄ¾²Ì¬ÌØÐÔµ¼ÖÂÆäÉúÃüÖÜÆÚͬӦÓÃÒ»Ñù³¤¡£

ÓÐʱ´´½¨µ¥ÀýʱÈç¹ûÎÒÃÇÐèÒªContext¶ÔÏó£¬Èç¹û´«ÈëµÄÊÇApplicationµÄContextÄÇô²»»áÓÐÎÊÌâ¡£Èç¹û´«ÈëµÄÊÇActivityµÄContext¶ÔÏó£¬ÄÇôµ±ActivityÉúÃüÖÜÆÚ½áÊøÊ±£¬¸ÃActivityµÄÒýÓÃÒÀÈ»±»µ¥Àý³ÖÓУ¬ËùÒÔ²»»á±»»ØÊÕ£¬¶øµ¥ÀýµÄÉúÃüÖÜÆÚÓÖÊǸúÓ¦ÓÃÒ»Ñù³¤£¬ËùÒÔÕâ¾ÍÔì³ÉÁËÄÚ´æÐ¹Â¶¡£

½â¾ö°ì·¨Ò»£ºÔÚ´´½¨µ¥ÀýµÄ¹¹ÔìÖв»Ö±½ÓÓô«½øÀ´µÄcontext£¬¶øÊÇͨ¹ýÕâ¸öcontext»ñÈ¡ApplicationµÄContext¡£´úÂëÈçÏ£º

public class AppManager { 
private static AppManager instance;
private Context context;
private AppManager(Context context) {
this.context = context.getApplicationContext();// ʹÓÃApplication µÄcontext
}
public static AppManager getInstance(Context context) {
if (instance != null) {
instance = new AppManager(context);
}
return instance;
}
}

µÚ¶þÖÖ½â¾ö·½°¸£ºÔÚ¹¹Ôìµ¥Àýʱ²»ÐèÒª´«Èë context£¬Ö±½ÓÔÚÎÒÃÇµÄ Application ÖÐдһ¸ö¾²Ì¬·½·¨£¬·½·¨ÄÚͨ¹ý getApplicationContext ·µ»Ø context£¬È»ºóÔÚµ¥ÀýÖÐÖ±½Óµ÷ÓÃÕâ¸ö¾²Ì¬·½·¨»ñÈ¡ context¡£

·Ç¾²Ì¬ÄÚ²¿ÀàÔì³ÉµÄÄÚ´æÐ¹Â¶

ÔÚ Java ÖУ¬·Ç¾²Ì¬ÄÚ²¿Àà(°üÀ¨ÄäÃûÄÚ²¿À࣬±ÈÈç Handler, RunnableÄäÃûÄÚ²¿Àà×îÈÝÒ×µ¼ÖÂÄÚ´æÐ¹Â¶)»á³ÖÓÐÍⲿÀà¶ÔÏóµÄÇ¿ÒýÓÃ(Èç Activity)£¬¶ø¾²Ì¬µÄÄÚ²¿ÀàÔò²»»áÒýÓÃÍⲿÀà¶ÔÏó¡£

·Ç¾²Ì¬ÄÚ²¿Àà»òÄäÃûÀàÒòΪ³ÖÓÐÍⲿÀàµÄÒýÓã¬ËùÒÔ¿ÉÒÔ·ÃÎÊÍⲿÀàµÄ×ÊÔ´ÊôÐÔ³ÉÔ±±äÁ¿µÈ;¾²Ì¬ÄÚ²¿À಻ÐС£

ÒòΪÆÕͨÄÚ²¿Àà»òÄäÃûÀàÒÀÀµÍⲿÀ࣬ËùÒÔ±ØÐëÏÈ´´½¨ÍⲿÀ࣬ÔÙ´´½¨ÆÕͨÄÚ²¿Àà»òÄäÃûÀà;¶ø¾²Ì¬ÄÚ²¿ÀàËæÊ±¶¼¿ÉÒÔÔÚÆäËûÍⲿÀàÖд´½¨¡£

HandlerÄÚ´æÐ¹Â¶¿ÉÒÔ¹Ø×¢ÎÒµÄÁíһƪרÃÅÕë¶ÔHandlerÄÚ´æÐ¹Â¶µÄÎÄÕ£ºÁ´½Ó

WebView µÄй©

Android ÖÐµÄ WebView ´æÔںܴóµÄ¼æÈÝÐÔÎÊÌ⣬ÓÐЩ WebView ÉõÖÁ´æÔÚÄÚ´æÐ¹Â¶µÄÎÊÌâ¡£ËùÒÔͨ³£¸ùÖÎÕâ¸öÎÊÌâµÄ°ì·¨ÊÇΪ WebView ¿ªÆôÁíÍâÒ»¸ö½ø³Ì£¬Í¨¹ý AIDL ÓëÖ÷½ø³Ì½øÐÐͨÐÅ£¬ WebView ËùÔڵĽø³Ì¿ÉÒÔ¸ù¾ÝÒµÎñµÄÐèҪѡÔñºÏÊʵÄʱ»ú½øÐÐÏú»Ù£¬´Ó¶ø´ïµ½ÄÚ´æµÄÍêÕûÊÍ·Å¡£

AlertDialog Ôì³ÉµÄÄÚ´æÐ¹Â¶

new AlertDialog.Builder(this) 
.setPositiveButton("Baguette", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
MainActivity.this.makeBread();
}
}).show();

DialogInterface.OnClickListener µÄÄäÃûʵÏÖÀà³ÖÓÐÁË MainActivity µÄÒýÓÃ;

¶øÔÚ AlertDialog µÄʵÏÖÖУ¬OnClickListener Àཫ±»°ü×°ÔÚÒ»¸ö Message ¶ÔÏóÖÐ(¾ßÌå¿ÉÒÔ¿´ AlertController ÀàµÄ setButton ·½·¨)£¬¶øÇÒÕâ¸ö Message »áÔÚÆäÄÚ²¿±»¸´ÖÆÒ»·Ý(AlertController ÀàµÄ mButtonHandler ÖпÉÒÔ¿´µ½)£¬Á½·Ý Message ÖÐÖ»ÓÐÒ»¸ö±» recycle£¬ÁíÒ»¸ö(OnClickListener µÄ³ÉÔ±±äÁ¿ÒýÓÃµÄ Message ¶ÔÏó)½«»áй¶!

½â¾ö°ì·¨£º

Android 5.0 ÒÔÉϲ»´æÔÚ´ËÎÊÌâ;

Message ¶ÔÏóµÄй©ÎÞ·¨±ÜÃ⣬µ«ÊÇÈç¹û½ö½öÊÇÒ»¸ö¿ÕµÄ Message ¶ÔÏ󣬽«±»·ÅÈë¶ÔÏó³Ø×÷ΪºóÓã¬ÊÇûÓÐÎÊÌâµÄ;

Èà DialogInterface.OnClickListener ¶ÔÏó²»³ÖÓÐÍⲿÀàµÄÇ¿ÒýÓã¬ÈçÓà static ÀàʵÏÖ;

ÔÚ Activity Í˳öǰ dismiss dialog

Drawable ÒýÆðµÄÄÚ´æÐ¹Â¶

Android ÔÚ 4.0 ÒÔºóÒѾ­½â¾öÁËÕâ¸öÎÊÌâ¡£ÕâÀï¿ÉÒÔÌø¹ý¡£

µ±ÎÒÃÇÆÁÄ»Ðýתʱ£¬Ä¬ÈÏ»áÏú»Ùµôµ±Ç°µÄ Activity£¬È»ºó´´½¨Ò»¸öÐ嵀 Activity ²¢±£³Ö֮ǰµÄ״̬¡£ÔÚÕâ¸ö¹ý³ÌÖУ¬Android ϵͳ»áÖØÐ¼ÓÔØ³ÌÐòµÄUIÊÓͼºÍ×ÊÔ´¡£¼ÙÉèÎÒÃÇÓÐÒ»¸ö³ÌÐòÓõ½ÁËÒ»¸öºÜ´óµÄ Bitmap ͼÏñ£¬ÎÒÃDz»Ïëÿ´ÎÆÁÄ»Ðýתʱ¶¼ÖØÐ¼ÓÔØÕâ¸ö Bitmap ¶ÔÏó£¬×î¼òµ¥µÄ°ì·¨¾ÍÊǽ«Õâ¸ö Bitmap ¶ÔÏóʹÓà static ÐÞÊΡ£

private static Drawable sBackground; 

@Override
protected void onCreate(Bundle state) {
super.onCreate(state);
TextView label = new TextView(this);
label.setText("Leaks are bad");

if (sBackground == null) {
sBackground = getDrawable(R.drawable.large_bitmap);
}
label.setBackgroundDrawable(sBackground);

setContentView(label);
}

µ«ÊÇÉÏÃæµÄ·½·¨ÔÚÆÁÄ»ÐýתʱÓпÉÄÜÒýÆðÄÚ´æÐ¹Â¶£¬ÒòΪ£¬µ±Ò»¸ö Drawable °ó¶¨µ½ÁË View ÉÏ£¬Êµ¼ÊÉÏÕâ¸ö View ¶ÔÏó¾Í»á³ÉΪÕâ¸ö Drawable µÄÒ»¸ö callback ³ÉÔ±±äÁ¿£¬ÉÏÃæµÄÀý×ÓÖо²Ì¬µÄ sBackground ³ÖÓÐ TextView ¶ÔÏóµÄÒýÓ㬶ø TextView ³ÖÓÐ Activity µÄÒýÓᣵ±ÆÁÄ»Ðýתʱ£¬Activity ÎÞ·¨±»Ïú»Ù£¬ÕâÑù¾Í²úÉúÁËÄÚ´æÐ¹Â¶ÎÊÌâ¡£

¸ÃÎÊÌâÖ÷Òª²úÉúÔÚ 4.0 ÒÔǰ£¬ÒòΪÔÚ 2.3.7 ¼°ÒÔϰ汾 Drawable µÄ setCallback ·½·¨µÄʵÏÖÊÇÖ±½Ó¸³Öµ£¬¶ø´Ó 4.0.1 ¿ªÊ¼£¬setCallback ²ÉÓÃÁËÈõÒýÓô¦ÀíÕâ¸öÎÊÌ⣬±ÜÃâÁËÄÚ´æÐ¹Â¶ÎÊÌâ¡£

×ÊԴδ¹Ø±ÕÔì³ÉµÄÄÚ´æÐ¹Â¶

BroadcastReceiver£¬ContentObserver Ö®ÀàµÄûÓнâ³ý×¢²á

Cursor£¬Stream Ö®ÀàµÄûÓÐ close

ÎÞÏÞÑ­»·µÄ¶¯»­ÔÚ Activity Í˳öǰûÓÐÍ£Ö¹

һЩÆäËûµÄ¸Ã release µÄûÓÐ release£¬¸Ã recycle µÄûÓÐ recycle¡­ µÈµÈ¡£

×ܽá

ÎÒÃDz»ÄÑ·¢ÏÖ£¬´ó¶àÊýÎÊÌâ¶¼ÊÇ static Ôì³ÉµÄ!

ÔÚʹÓà static ʱһ¶¨ÒªÐ¡ÐÄ£¬¹Ø×¢¸Ã static ±äÁ¿³ÖÓеÄÒýÓÃÇé¿ö¡£ÔÚ±ØÒªÇé¿öÏÂʹÓÃÈõÒýÓõķ½Ê½À´³ÖÓÐһЩÒýÓÃ

ÔÚʹÓ÷Ǿ²Ì¬ÄÚ²¿ÀàʱҲҪעÒ⣬±Ï¾¹ËüÃdzÖÓÐÍⲿÀàµÄÒýÓá£(ʹÓà RxJava µÄͬѧÔÚ subscribe ʱҲҪעÒâ unSubscribe)

×¢ÒâÔÚÉúÃüÖÜÆÚ½áÊøÊ±ÊÍ·Å×ÊÔ´

ʹÓÃÊôÐÔ¶¯»­Ê±£¬²»ÓõÄʱºòÇëÍ£Ö¹(ÓÈÆäÊÇÑ­»·²¥·ÅµÄ¶¯»­)£¬²»È»»á²úÉúÄÚ´æÐ¹Â¶(Activity ÎÞ·¨ÊÍ·Å)(View ¶¯»­²»»á)

¼¸ÖÖÄÚ´æ¼ì²â¹¤¾ßµÄ½éÉÜ

Memory Monitor

Allocation Tracker

Heap Viewer

LeakCanary

Memory Monitor

λÓÚ Android Monitor ÖУ¬¸Ã¹¤¾ß¿ÉÒÔ£º

·½±ãµÄÏÔʾÄÚ´æÊ¹ÓÃºÍ GC Çé¿ö

¿ìËÙ¶¨Î»¿¨¶ÙÊÇ·ñºÍ GC ÓйØ

¿ìËÙ¶¨Î» Crash ÊÇ·ñºÍÄÚ´æÕ¼Óùý¸ßÓйØ

¿ìËÙ¶¨Î»Ç±ÔÚµÄÄÚ´æÐ¹Â¶ÎÊÌâ(ÄÚ´æÕ¼ÓÃÒ»Ö±ÔÚÔö³¤)

µ«ÊDz»ÄÜ׼ȷµÄ¶¨Î»ÎÊÌâ

Allocation Tracker

¸Ã¹¤¾ßÓÃ;£º

¿ÉÒÔ¶¨Î»´úÂëÖзÖÅäµÄ¶ÔÏóÀàÐÍ¡¢´óС¡¢Ê±¼ä¡¢Ï̡߳¢¶ÑÕ»µÈÐÅÏ¢

¿ÉÒÔ¶¨Î»ÄÚ´æ¶¶¶¯ÎÊÌâ

ÅäºÏ Heap Viewer ¶¨Î»ÄÚ´æÐ¹Â¶ÎÊÌâ(¿ÉÒÔÕÒ³öÀ´Ð¹Â¶µÄ¶ÔÏóÊÇÔÚÄÄ´´½¨µÄµÈµÈ)

ʹÓ÷½·¨£ºÔÚ Memory Monitor ÖÐÓиö Start Allocation Tracking °´Å¥¼´¿É¿ªÊ¼¸ú×Ù ÔÚµã»÷Í£Ö¹¸ú×Ùºó»áÏÔʾͳ¼Æ½á¹û¡£

Heap Viewer

¸Ã¹¤¾ßÓÃÓÚ£º

ÏÔʾÄÚ´æ¿ìÕÕÐÅÏ¢

ÿ´Î GC ºóÊÕ¼¯Ò»´ÎÐÅÏ¢

²éÕÒÄÚ´æÐ¹Â¶µÄÀûÆ÷

ʹÓ÷½·¨£º ÔÚ Memory Monitor ÖÐÓиö Dump Java Heap °´Å¥£¬µã»÷¼´¿É£¬ÔÚͳ¼Æ±¨¸æ×óÉϽÇÑ¡°´ package ·ÖÀà¡£ÅäºÏ Memory Monitor µÄ initiate GC(Ö´ÐÐ GC)°´Å¥£¬¿É¼ì²âÄÚ´æÐ¹Â¶µÈÇé¿ö¡£

LeakCanary

ÖØÒªµÄÊÂÇé˵Èý±é£º

for (int i = 0; i < 3; i++) { 
Log.e(TAG, "¼ì²âÄÚ´æÐ¹Â¶µÄÉñÆ÷!");
}

LeakCanary ¾ßÌåʹÓò»ÔÙ׸Êö£¬×ÔÐÐ Google¡£

   
2423 ´Îä¯ÀÀ       32
 
Ïà¹ØÎÄÕÂ

ÊÖ»úÈí¼þ²âÊÔÓÃÀýÉè¼ÆÊµ¼ù
ÊÖ»ú¿Í»§¶ËUI²âÊÔ·ÖÎö
iPhoneÏûÏ¢ÍÆËÍ»úÖÆÊµÏÖÓë̽ÌÖ
AndroidÊÖ»ú¿ª·¢£¨Ò»£©
 
Ïà¹ØÎĵµ

Android_UI¹Ù·½Éè¼Æ½Ì³Ì
ÊÖ»ú¿ª·¢Æ½Ì¨½éÉÜ
androidÅÄÕÕ¼°ÉÏ´«¹¦ÄÜ
Android½²ÒåÖÇÄÜÊÖ»ú¿ª·¢
Ïà¹Ø¿Î³Ì

Android¸ß¼¶Òƶ¯Ó¦ÓóÌÐò
Androidϵͳ¿ª·¢
AndroidÓ¦Óÿª·¢
ÊÖ»úÈí¼þ²âÊÔ
×îл¼Æ»®
ͼÊý¾Ý¿âÓë֪ʶͼÆ× 8-28[±±¾©]
OCSMPÈÏÖ¤£ºOCSMP-MBF 8-29[±±¾©]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 9-9[±±¾©]
Èí¼þ¼Ü¹¹Éè¼Æ·½·¨¡¢°¸Àýʵ¼ù 9-24[±±¾©]
ÐèÇó·ÖÎöʦÄÜÁ¦ÅàÑø 10-30[±±¾©]
MBSEÌåϵÓëʵ¼ù 8-26[±±¾©]

androidÈË»ú½çÃæÖ¸ÄÏ
AndroidÊÖ»ú¿ª·¢£¨Ò»£©
AndroidÊÖ»ú¿ª·¢£¨¶þ£©
AndroidÊÖ»ú¿ª·¢£¨Èý£©
AndroidÊÖ»ú¿ª·¢£¨ËÄ£©
iPhoneÏûÏ¢ÍÆËÍ»úÖÆÊµÏÖ̽ÌÖ
ÊÖ»úÈí¼þ²âÊÔÓÃÀýÉè¼ÆÊµ¼ù
ÊÖ»ú¿Í»§¶ËUI²âÊÔ·ÖÎö
ÊÖ»úÈí¼þ×Ô¶¯»¯²âÊÔÑо¿±¨¸æ


Android¸ß¼¶Òƶ¯Ó¦ÓóÌÐò
AndroidÓ¦Óÿª·¢
Androidϵͳ¿ª·¢
ÊÖ»úÈí¼þ²âÊÔ
ǶÈëʽÈí¼þ²âÊÔ
AndroidÈí¡¢Ó²¡¢ÔÆÕûºÏ


ÁìÏÈIT¹«Ë¾ android¿ª·¢Æ½Ì¨×î¼Ñʵ¼ù
±±¾© Android¿ª·¢¼¼Êõ½ø½×
ijÐÂÄÜÔ´ÁìÓòÆóÒµ Android¿ª·¢¼¼Êõ
ijº½Ì칫˾ Android¡¢IOSÓ¦ÓÃÈí¼þ¿ª·¢
°¢¶û¿¨ÌØ LinuxÄÚºËÇý¶¯
°¬Ä¬Éú ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ
Î÷ÃÅ×Ó Ç¶Èëʽ¼Ü¹¹Éè¼Æ