
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¡£
|