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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
¶¶Òô Android ÐÔÄÜÓÅ»¯ÏµÁУºJava ÄÚ´æÓÅ»¯Æª
 
 
  3356  次浏览      28
 2021-4-22 
 
±à¼­ÍƼö:
±¾ÎÄ´Ó¶¶Òô Java OOM ÄÚ´æÓÅ»¯µÄÖÎÀíʵ¼ù³ö·¢£¬³¢ÊÔ¸ø´ó¼Ò·ÖÏíһ϶¶ÒôÍŶӹØÓÚ Java ÄÚ´æÓÅ»¯ÖеÄһЩ˼¿¼£¬°üÀ¨¹¤¾ß½¨Éè¡¢ÓÅ»¯·½·¨ÂÛ¡£

±¾ÎÄÀ´×ÔÓÚ×Ö½ÚÌø¶¯¼¼ÊõÍŶӣ¬ÓÉ»ðÁú¹ûÈí¼þAnna±à¼­¡¢ÍƼö¡£

ÄÚ´æ×÷Ϊ¼ÆËã»ú³ÌÐòÔËÐÐ×îÖØÒªµÄ×ÊÔ´Ö®Ò»£¬ÐèÒªÔËÐйý³ÌÖÐ×öµ½ºÏÀíµÄ×ÊÔ´·ÖÅäÓë»ØÊÕ£¬²»ºÏÀíµÄÄÚ´æÕ¼ÓÃÇáÔòʹµÃÓû§Ó¦ÓóÌÐòÔËÐп¨¶Ù¡¢ANR¡¢ºÚÆÁ£¬ÖØÔòµ¼ÖÂÓû§Ó¦ÓóÌÐò·¢Éú OOM£¨out of memory£©±ÀÀ£¡£¶¶Òô×÷Ϊһ¿îÓû§Ê¹Óù㷺µÄ²úÆ·£¬ÐèÒªÔÚ¸÷ÖÖ»úÆ÷×ÊÔ´Éϱ£³ÖÓÅÐãµÄÁ÷³©ÐÔºÍÎȶ¨ÐÔ£¬ÄÚ´æÓÅ»¯ÊDZØÐëÒªÖØÊӵĻ·½Ú¡£

¶¶Òô Java OOM ±³¾°

ÔÚδ¶Ô¶¶ÒôÄÚ´æ½øÐÐרÏîÖÎÀí֮ǰÎÒÃÇÊáÀíÁËÒ»ÏÂÕûÌåÄÚ´æÖ¸±êµÄ¾ø¶ÔÖµºÍÏà¶Ô±ÀÀ££¬·¢ÏÖÕ¼±È¶¼ºÜ¸ß¡£ÁíÍ⣬ÄÚ´æÏà¹ØÖ¸±êÔÚÈ¥Äê´º½Ú»î¶¯Ê±ÓÖÔٴμ¤Ôö´ïµ½Àúʷиߣ¬ËùÒÔÕûÌåÀ´¿´ÄÚ´æÎÊÌâÏ൱ÑϾþ£¬±ØÐëÒª¶ÔÆä½øÐÐרÏîÖÎÀí¡£¶¶ÒôÕâ±ßͨ¹ýǰÆÚ¹éÒò¡¢¹¤¾ß½¨ÉèÒÔ¼°Í¶ÈëÒ»¸ö˫ԵÄÄÚ´æ×¨ÏîÖÎÀí½«ÕûÌå Java OOM ÓÅ»¯Á˰ٷÖÖ® 80¡£

Java OOM Top ¶ÑÕ»¹éÒò

ÔÚ¶Ô¶¶ÒôµÄ Java ÄÚ´æÓÅ»¯ÖÎÀí֮ǰÎÒÃÇÏȸù¾Ýƽ̨Éϱ¨µÄ¶ÑÕ»Òì³£¶Ôµ±Ç°µÄ OOM ½øÐйéÒò£¬Ö÷Òª·ÖΪÏÂÃæ¼¸Àࣺ

ͼ 1. OOM ·ÖÀà

ÆäÖÐ pthread_create ÎÊÌâÕ¼µ½ÁË×ܱÈÀý´óÔ¼ÔÚ°Ù·ÖÖ® 50£¬Java ¶ÑÄڴ泬ÏÞΪ°Ù·ÖÖ® 40 ¶à£¬Ê£ÏÂÊÇÉÙÁ¿µÄ fd ÊýÁ¿³¬ÏÞ¡£ÆäÖÐ pthread_create ºÍ fd ÊýÁ¿²»×ã¾ùΪ native ÄÚ´æÏÞÖÆµ¼Ö嵀 Java ²ã±ÀÀ££¬ÎÒÃǶÔÕⲿ·ÖµÄÄÚ´æÎÊÌâÒ²×öÁËÕë¶ÔÐÔÓÅ»¯£¬Ö÷Òª°üÀ¨£º

Ïß³ÌÊÕÁ²¡¢¼à¿Ø

Ïß³Ìջй©×Ô¶¯ÐÞ¸´

FD й©¼à¿Ø

ÐéÄâÄÚ´æ¼à¿Ø¡¢ÓÅ»¯

¶¶Òô 64 λרÏî

ÖÎÀíÖ®ºó pthread_create ÎÊÌâ½µµÍµ½ÁË 0.02¡ëÒÔÏ£¬Õâ·½ÃæµÄÖÎÀíʵ¼ù»áÔÚÏÂһƪ¶¶Òô Native ÄÚ´æÖÎÀíʵ¼ùÖÐÏêϸ½éÉÜ£¬´ó¼Ò¾´ÇëÆÚ´ý¡£±¾ÎÄÖØµã½éÉÜ Java ¶ÑÄÚ´æÖÎÀí¡£

¶ÑÄÚ´æÖÎÀí˼·

´Ó Java ¶ÑÄڴ泬Ï޵ķÖÀàÀ´¿´£¬Ö÷ÒªÓÐÁ½ÀàÎÊÌ⣺

1. ¶ÑÄÚ´æµ¥´Î·ÖÅä¹ý´ó/¶à´Î·ÖÅäÀۼƹý´ó¡£

´¥·¢ÕâÀàÎÊÌâµÄÔ­ÒòÓÐÊý¾ÝÒì³£µ¼Öµ¥´ÎÄÚ´æ·ÖÅä¹ý´ó³¬ÏÞ£¬Ò²ÓÐһЩÊÇ StringBuilder Æ´½ÓÀۼƴóС¹ý´óµ¼Öµȵȡ£ÕâÀàÎÊÌâµÄ½â¾ö˼·±È½Ï¼òµ¥£¬ÎÊÌâ¾ÍÔÚµ±Ç°µÄ¶ÑÕ»¡£

2. ¶ÑÄÚ´æÀÛ»ý·ÖÅä´¥¶¥¡£

ÕâÀàÎÊÌâµÄÎÊÌâ¶ÑÕ»»á±È½Ï·ÖÉ¢£¬ÔÚÈκÎÄÚ´æ·ÖÅäµÄ³¡¾°É϶¼ÓпÉÄܻᱻ´¥·¢£¬ÄÇЩ¸ßƵµÄÄÚ´æ·ÖÅä½Úµã·¢ÉúµÄ¸ÅÂÊ»á¸ü¸ß£¬±ÈÈç Bitmap ·ÖÅäÄÚ´æ¡£ÕâÀà OOM µÄ¸ù±¾Ô­ÒòÊÇÄÚ´æÀÛ»ýÕ¼Óùý¶à£¬¶øµ±Ç°µÄ¶ÑÕ»Ö»ÊÇѹËÀÂæÍÕµÄ×îºóÒ»¸ùµ¾²Ý£¬²¢²»ÊÇÎÊÌâµÄ¸ù±¾ËùÔÚ¡£ËùÒÔÕâÀàÎÊÌâÎÒÃÇÐèÒª·ÖÎöÕûÌåµÄÄÚ´æ·ÖÅäÇé¿ö£¬´ÓÖÐÕÒµ½²»ºÏÀíµÄÄÚ´æÊ¹Ó㨱ÈÈçÄÚ´æÐ¹Â¶¡¢´ó¶ÔÏó¡¢¹ý¶àС¶ÔÏó¡¢´óͼµÈ£©¡£

¹¤¾ß½¨Éè

¹¤¾ß˼·

¹¤ÓûÉÆÆäÊ£¬±ØÏÈÀûÆäÆ÷¡£´ÓÉÏÃæµÄÄÚ´æÖÎÀí˼·¿´£¬¹¤¾ßÐèÒªÖ÷Òª½â¾öµÄÎÊÌâÊÇ·ÖÎöÕûÌåµÄÄÚ´æ·ÖÅäÇé¿ö£¬·¢ÏÖ²»ºÏÀíµÄÄÚ´æÊ¹Ó㨱ÈÈçÄÚ´æÐ¹Â¶¡¢´ó¶ÔÏó¡¢¹ý¶àС¶ÔÏóµÈ£©¡£

ÎÒÃÇ´ÓÏßϺÍÏßÉÏÁ½¸öά¶ÈÀ´½¨É蹤¾ß£º

ÏßÏÂ

ÏßϹ¤¾ßÊÇ×îÏÈ¿¼Âǵģ¬ÔÚÑз¢ºÍ²âÊÔµÄʱºòÄܹ»Ìáǰ·¢ÏÖÄÚ´æÐ¹Â©ÎÊÌâ¡£Òµ½çµÄÖ÷Á÷¹¤¾ßÒ²ÊÇÕâ¸ö˼·£¬±ÈÈç Android Studio Memory Profiler¡¢LeakCanary¡¢Memory Analyzer (MAT)¡£

ÎÒÃÇ»ùÓÚ LeakCanary ºËÐÄ¿âÔÚÏßÏÂÉè¼ÆÁËÒ»Ì××Ô¶¯·ÖÎöÉϱ¨ÄÚ´æÐ¹Â¶µÄ¹¤¾ß£¬Ö÷ÒªÁ÷³ÌÈçÏ£º

ͼ 2.ÏßÏÂ×Ô¶¯·ÖÎöÁ÷³Ì

¶¶ÒôÔÚÔËÐÐÁËÒ»¶ÎÏßϵÄÄÚ´æÐ¹Â©¹¤¾ßÖ®ºó£¬·¢ÏÖÁËÏßϹ¤¾ßµÄ¸÷ÖÖ±×¶Ë£º

¼ì²â³öÀ´µÄÄÚ´æÐ¹Â©¹ý¶à£¬²¢ÇÒҲûÓбȽϺõÄÓÅÏȼ¶ÅÅÐò£¬Ñз¢Ïû·Ñ²»¹ýÀ´£¬ÀúÊ·ÎÊÌâ¾ÍÒ»Ö±¶Ñ»ý¡£ÁíÍâÒ²ºÜÄѺÍÒµÎñÑз¢¹µÍ¨ÎÊÌâ½â¾öµÄÊÕÒæ£¬´ó¼ÒÕë¶Ô½â¾öÏßϵÄÄÚ´æÐ¹Â©ÎÊÌâµÄ ROI£¨Í¶Èë²ú³ö±È£©±È½ÏÄÑ¶ÔÆë¡£

Ïßϳ¡¾°ÄÜÅܵ½µÄ³¡¾°ÓÐÏÞ£¬ºÜÄѰÑËùÓÐÓû§³¡¾°Ç¡£¶¶ÒôÓû§»ùÊýºÜ´ó£¬ÎÒÃǾ­³£Óöµ½Ò»Ð©ÏßÉ쵀 OOM ¼¤ÔöÎÊÌ⣬ÒòΪȱÉÙÏßÉÏÊý¾Ý¶øÎÞ´Ó²éÆð¡£

Android ¶ËµÄ HPORF µÄ»ñÈ¡ÒÀÀµÔ­ÉúµÄ Debug.dumpHporf£¬dump ¹ý³Ì»á¹ÒÆðÖ÷Ï̵߳¼ÖÂÃ÷ÏÔ¿¨¶Ù£¬ÏßÏÂʹÓÃÌåÑé½Ï²î£¬¾­³£»áÓÐÑз¢·´À¡Ó°Ïì²âÊÔ¡£

LeakCanary »ùÓÚ Shark ·ÖÎöÒýÇæ·ÖÎö£¬·ÖÎöËٶȽÏÂý£¬Í¨³£ÔÚ 5 ·ÖÖÓÒÔÉϲÅÄÜ·ÖÎöÍê³É£¬·ÖÎö¹ý³Ì»áÓ°Ïì½ø³ÌÄÚ´æÕ¼Óá£

·ÖÎö½á¹û½ÏΪµ¥Ò»£¬½ö½öÖ»ÄÜ·ÖÎö³ö Fragment¡¢Activity ÄÚ´æÐ¹Â¶£¬Ïñ´ó¶ÔÏó¡¢¹ý¶àС¶ÔÏóÎÊÌâµ¼ÖµÄÄÚ´æ OOM ÎÞ·¨·ÖÎö¡£

ÏßÉÏ

ÕýÊÇÓÉÓÚÉÏÊöһЩ±×¶Ë£¬¶¶Òô×îÔçµÄÏßϹ¤¾ßºÍÖÎÀíÁ÷³Ì²¢Ã»ÓÐÆðµ½Ê²Ã´Ì«´ó×÷Óã¬ÎÒÃDz»µÃ²»ÖØÐÂÉóÊÓһϣ¬¹¤¾ß½¨ÉèµÄÖØÐÄ´ÓÏßÏÂת³ÉÁËÏßÉÏ¡£ÏßÉϹ¤¾ßµÄºËÐÄ˼·ÊÇ£ºÔÚ·¢Éú OOM »òÕßÄÚ´æ´¥¶¥µÈ´¥·¢Ìõ¼þÏ£¬dump ÄÚ´æµÄ HPROF Îļþ£¬¶Ô HPROF Îļþ½øÐзÖÎö£¬·ÖÎö³öÄÚ´æÐ¹Â©¡¢´ó¶ÔÏó¡¢Ð¡¶ÔÏó¡¢Í¼Æ¬ÎÊÌâ²¢°´ÕÕй¶Á´Â·×Ô¶¯¹éÒò£¬½«´óÊý¾ÝÎÊÌâ°´ÕÕÓû§·¢Éú´ÎÊý¡¢Ð¹Â¶´óС¡¢×Ü´óСµÈγ¶ÈÅÅÐò£¬ÍƽøÒµÎñÑз¢°´ÕÕÓÅÏȼ¶Ë³ÐòÀ´½¨Á¢Ïû·ÑÁ÷³Ì¡£Îª´ËÎÒÃÇÑз¢ÁËÒ»Ì×»ùÓÚ HPORF ·ÖÎöµÄÏßÏ¡¢ÏßÉϱջ·µÄ×Ô¶¯»¯·ÖÎö¹¤¾ß Liko£¨Ô¢Òâ ko ÄÚ´æ Leak ÎÊÌ⣩¡£

Liko ½éÉÜ

Liko ÕûÌå¼Ü¹¹

ͼ 3. Liko ¼Ü¹¹Í¼

ÕûÌå¼Ü¹¹Óɿͻ§¶Ë¡¢Server ¶ËºÍºËÐÄ·ÖÎöÒýÇæÈý²¿·Ö¹¹³É¡£

¿Í»§¶Ë

ÔÚ¿Í»§¶ËÍê³É HPROF Êý¾Ý²É¼¯ºÍ·ÖÎö£¨Õë¶Ô¶ËÉÏ·ÖÎöģʽ£©£¬ÕâÀïÏßÉϺÍÏßϲßÂÔ²»Í¬¡£

ÏßÉÏ£ºÖ÷ÒªÔÚ OOM ºÍÄÚ´æ´¥¶¥Ê±Í¨¹ýÓû§ÎÞ¸ÐÖª dump À´»ñÈ¡ HPROF Îļþ£¬µ± App Í˳öµ½ºǫ́ÇÒÄÚ´æ³ä×ãµÄÇé¿ö½øÐзÖÎö£¬ÎªÁ˾¡Á¿¼õÉÙ¶Ô App ÔËÐÐʱӰÏ죬Ö÷Ҫͨ¹ý²Ã¼ô HPROF »Ø´«½øÐзÖÎö£¬Îª¼õÇá·þÎñÆ÷ѹÁ¦£¬¶Ô²¿·Ö±ÈÀýÓû§²ÉÓöËÉÏ·ÖÎö×÷Ϊ Backup¡£

ÏßÏ£ºdump ²ßÂÔÅäÖýÏΪ¼¤½ø£¬ÔÚ OOM¡¢ÄÚ´æ´¥¶¥¡¢Äڴ漤Ôö¡¢¼à²â Activity¡¢Fragment й©ÊýÁ¿´ïµ½Ò»¶¨ãÐÖµ¶àÖÖ³¡¾°Ï´¥·¢ dump£¬²¢ÊµÊ±ÔÚ¶ËÉÏ·ÖÎöÉÏ´«ÖÁºǫ́²¢ÔÚ±¾µØ×Ô¶¯Éú³É html ±¨±í£¬°ïÖúÑз¢Ìáǰ·¢ÏÖ¿ÉÄÜ´æÔÚµÄÄÚ´æÎÊÌâ¡£

Server ¶Ë

Server ¶Ë¸ù¾ÝÏßÉϻش«µÄ´óÊý¾ÝÍê³ÉÁ´Â·¾ÛºÏ¡¢»¹Ô­¡¢·ÖÅ䣬²¢¸ù¾ÝÓû§·¢Éú´ÎÊý¡¢Ð¹Â¶´óС¡¢×Ü´óСµÈγ¶È´Ù½øÑз¢²âÏû·Ñ£¬¶ÔÓڻش«·ÖÎöģʽÔò»áÁíÍâ½øÐÐ HPORF ·ÖÎö¡£

·ÖÎöÒýÇæ

»ùÓÚ MAT ·ÖÎöÒýÇæÍê³ÉÄÚ´æÐ¹Â¶¡¢´ó¶ÔÏó¡¢Ð¡¶ÔÏó¡¢Í¼Æ¬µÈ×Ô¶¯¹éÒò£¬Í¬Ê±Ö§³ÖÔÚÏßÏÂ×Ô¶¯Éú³É Html ±¨±í¡£

Liko Á÷³Ìͼ

ͼ 4. Liko Á÷³Ìͼ

ÕûÌåÁ÷³Ì·ÖΪ£º

Hprof ÊÕ¼¯

·ÖÎöʱ»ú

·ÖÎö²ßÂÔ

Hprof ÊÕ¼¯

ÊÕ¼¯¹ý³ÌÎÒÃÇÉèÖÃÁ˶àÖÖ²ßÂÔ¿ÉÒÔ×ÔÓÉ×éºÏ£¬Ö÷ÒªÓÐ OOM¡¢ÄÚ´æ´¥¶¥¡¢Äڴ漤Ôö¡¢¼à²â Activity¡¢Fragment й©ÊýÁ¿´ïµ½Ò»¶¨ãÐֵʱ´¥·¢£¬ÏßÏÂÏßÉϲßÂÔÅäÖò»Í¬¡£

ΪÁ˽â¾ö dump ¹ÒÆð½ø³ÌÎÊÌ⣬ÎÒÃDzÉÓÃÁË×Ó½ø³Ì dump+fileObsever µÄ·½Ê½Íê³É dump ²É¼¯ºÍ¼àÌý¡£

ÔÚ fork ×Ó½ø³Ì֮ǰÏÈ Suspend »ñÈ¡Ö÷½ø³ÌÖеÄÏ߳̿½±´£¬Í¨¹ý fork ϵͳµ÷Óô´½¨×Ó½ø³ÌÈÃ×Ó½ø³ÌÓµÓи¸½ø³ÌµÄ¿½±´£¬È»ºó fork ³öµÄ×Ó½ø³ÌÖе÷Óà Hprof µÄ DumpHeap º¯Êý¼´¿ÉÍê³É°ÑºÄʱµÄ dump ²Ù×÷ÔÚ·ÅÔÚ×Ó½ø³Ì¡£ÓÉÓÚ suspend ºÍ resume ÊÇϵͳº¯Êý£¬ÎÒÃÇÕâÀïͨ¹ý×ÔÑÐµÄ native hook ¹¤¾ß¶Ô libart.so hook »ñȡϵͳµ÷Óá£ÓÉÓÚдÈëÊÇÔÚ×Ó½ø³ÌÍê³ÉµÄ£¬ÎÒÃÇͨ¹ý Android ÌṩµÄ fileObsever ÎļþдÈë½øÐÐ¼à¿Ø»ñÈ¡ dump Íê³Éʱ»ú¡£

ͼ 5.×Ó½ø³Ì dump Á÷³Ìͼ

Hprof ·ÖÎöʱ»ú

ΪÁË´ïµ½·ÖÎö¹ý³Ì¶ÔÓÚÓû§Î޸У¬ÎÒÃÇÔÚÏßÉÏ¡¢ÏßÏÂÅäÖÃÁ˲»Í¬µÄ·ÖÎöʱ»ú²ßÂÔ£¬ÏßÏÂÔÚ dump ·ÖÎöÍê³Éºó¸ù¾ÝÄÚ´æ×´Ì¬Ö÷¶¯´¥·¢·ÖÎö£¬ÏßÉϵ±Óû§Ï´ÎÀäÆôÍ˳öÓ¦Óúǫ́ÇÒÄÚ´æ³ä×ãµÄÇé¿öÏ´¥·¢·ÖÎö¡£

·ÖÎö²ßÂÔ

·ÖÎö²ßÂÔÎÒÃÇÌṩÁËÁ½ÖÖ£¬Ò»ÖÖÔÚ Android ¿Í»§¶Ë·ÖÎö£¬Ò»Öֻش«ÖÁ Server ¶Ë·ÖÎö£¬¾ùͨ¹ý MAT ·ÖÎöÒýÇæ½øÐзÖÎö¡£

¶ËÉÏ·ÖÎö

·ÖÎöÒýÇæ

¶ËÉÏ·ÖÎöÒýÇæµÄÐÔÄܺÜÖØÒª£¬ÕâÀïÎÒÃÇÖ÷Òª¶Ô±ÈÁË LeakCanary µÄ·ÖÎöÒýÇæ Shark ºÍ Haha ¿âµÄ MAT¡£

ͼ 6. Shark VS MAT

ÎÒÃÇÔÚÏàͬ¿Í»§¶Ë»·¾³¶Ô 160M µÄ HPROF ¶à´Î·ÖÎö¶Ô±È·¢ÏÖ MAT ·ÖÎöËÙ¶ÈÃ÷ÏÔÓÅÓÚ Shark£¬ÁíÍâÕë¶Ô MAT ·ÖÎöºóÈÔ³ÖÓÐͳÖÎÕßÊ÷Õ¼ÓÃÄÚ´æÎÒÃÇÒ²×öÁËÖ÷¶¯ÊÍ·Å£¬¶Ô±ÈÐÔÄÜÊÕÒæºó²ÉÓûùÓÚ MAT ¿âµÄ·ÖÎöÒýÇæ½øÐзÖÎö£¬¶ÔÄÚ´æÐ¹Â©ÒýÓÃÁ´Â·×Ô¶¯¹é²¢¡¢´ó¶ÔÏóС¶ÔÏóÒýÓÃÁ´×Ô¶¯·ÖÎö¡¢´óͼÏßÏÂ×Ô¶¯»¹Ô­ÏßÉϹýÂËÎÞÓÃÁ´Â·£¬·ÖÎö½á¹ûÈçÏ£º

ÄÚ´æÐ¹Â©

ͼ 7. ÄÚ´æÐ¹Â©Á´Â·

¶Ôй©µÄ Activity µÄÒýÓÃÁ´½øÐÐÁ˾ۺϷÖÎö£¬·½±ãÒ»´ÎÐÔ½â¾ö¸Ã Activity µÄй©Á´ÊÍ·ÅÄÚ´æ¡£

´ó¶ÔÏó

ͼ 8. ´ó¶ÔÏóÁ´Â·

´ó¶ÔÏó²»Ö¹·ÖÎöÁËÒýÓÃÁ´Â·£¬»¹µÝ¹é·ÖÎöÁËÄÚ²¿ top ³ÖÓжÔÏó£¨InRefrenrece£©µÄ RetainedSize¡£

С¶ÔÏó

ͼ 9. С¶ÔÏóÁ´Â·

С¶ÔÏóÎÒÃÇ¶Ô top µÄÍⲿ³ÖÓжÔÏó£¨OutRefrenrece£©½øÐоۺϵõ½Õ¼ÓÐС¶ÔÏó×î¶àµÄÁ´Â·¡£

ͼƬ

ͼ 10. ͼƬÁ´Â·

ͼƬÎÒÃǹýÂËÁËͼƬ¿âµÈÎÞЧÒýÓÃÇÒ¶Ô Android 8.0 ÒÔϵĴóͼÔÚÏßϽøÐÐÁË»¹Ô­¡£

»Ø´«·ÖÎö

ΪÁË×î´óÏ޶ȵĽÚÊ¡Óû§Á÷Á¿ÇÒ¹æ±ÜÒþ˽·çÏÕ£¬ÎÒÃÇͨ¹ý×ÔÑÐ HPROF ²Ã¼ô¹¤¾ß Tailor ÔÚ dump ¹ý³Ì¶Ô HPROF ½øÐÐÁ˲üô¡£

²Ã¼ô¹ý³Ì

ͼ 11. Tailor ²Ã¼ôÁ÷³Ì

È¥³ýÁËÎÞÓÃÐÅÏ¢

Ìø¹ý header

·Ö tag ²Ã¼ô

²Ã¼ôÎÞÓÃÐÅÏ¢£ºchar[]; byte[]; timestamp; stack trace serial number; class serial number;

ѹËõÊý¾ÝÐÅÏ¢

ͬʱ¶ÔÊý¾Ý½øÐÐ zlib ѹËõ£¬ÔÚ server ¶ËÊý¾Ý»¹Ô­£¬ÕûÌå²Ã¼ôЧ¹û£º180M--->50M---->13M

ÓÅ»¯Êµ¼ù

ÄÚ´æÐ¹Â©

³ýÁËͨ¹ýºǫ́¸ù¾Ý GCROOT+ ÒýÓÃÁ´×Ô¶¯·ÖÅäÑз¢¸ú½ø½â¾öÎÒÃdz£¼ûµÄÄÚ´æÐ¹Â©Í⣬ÎÒÃÇ»¹¶Ôϵͳµ¼ÖÂһЩÄÚ´æÐ¹Â©½øÐÐÁË·ÖÎöºÍÐÞ¸´¡£

ϵͳÒì²½ UI й©

¸ù¾ÝÉÏ´«¾ÛºÏµÄÒýÓÃÁ´ÎÒÃÇ·¢ÏÖÔÚ Android 6.0 ÒÔÏÂÓÐÒ»¸ö HandlerThread ×÷Ϊ GCROOT ³ÖÓдóÁ¿ Activity µ¼ÖÂÄÚ´æÐ¹Â©£¬¸ù¾ÝÒýÓ÷¢ÏÖÕâЩй©µÄ Activity ¶¼±»Ò»¸ö Runnable£¨ÕâÀïÊÇ Runnable ÊÇÒ»¸öϵͳʼþ SendViewStateChangedAccessibilityEvent£©³ÖÓУ¬ÕâЩ Runnable ±»Ìí¼Óµ½Ò»¸ö RunQueuel ÖУ¬Õâ¸ö¶ÓÁб¾Éí±» TheadLocal ³ÖÓС£

ͼ 12. HandlerThread й¶Á´Â·

ÎÒÃÇ´Ó SendViewStateChangedAccessibilityEvent ÈëÊÖ¶ÔÔ´Âë½øÐÐÁË·ÖÎö·¢ÏÖËüÔÚ notifyViewAccessibilityStateChangedIfNeeded Öб»Å׳ö£¬ÏµÍ³µÄ´óÁ¿ view ¶¼»áÔÚ×ÔÉíµÄһЩ UI ·½·¨£¨eg: setChecked£©Öд¥·¢¸Ãº¯Êý¡£

SendViewStateChangedAccessibilityEvent µÄ runOrPost ·½·¨»á×ßµ½ÎÒÃdz£ÓÃµÄ View µÄ postDelay ·½·¨ÖУ¬Õâ¸ö·½·¨ÔÚµ± view »¹Î´±» attched µ½¸ù view µÄʱºò»á¼ÓÈëµ½Ò»¸ö runQueue ÖС£

Õâ¸ö runQueue »áÔÚÖ÷Ïß³ÌÏÂÒ»´ÎµÄ performTraversals() ÖÐÏû·Ñµô¡£

Èç¹ûÕâ¸ö runQueue ²»ÔÚÖ÷Ïß³ÌÄǾÍûÓÐÏû·ÑµÄ»ú»á¡£

¸ù¾ÝÉÏÃæµÄ·ÖÎö·¢ÏÖÔì³ÉÕâÖÖÄÚ´æÐ¹Â©ÐèÒªÂú×ãһЩÌõ¼þ£º

view µ÷ÓÃÁË postDelay ·½·¨ £¨ÕâÀïÊÇ notifyViewAccessisbilityStateChangeIfNeeded ´¥·¢£©

view ´¦ÓÚ detached ״̬

ÉÏÊö¹ý³ÌÊÇÔÚ·ÇÖ÷Ïß³ÌÀïÃæ²Ù×÷µÄ£¬ThreadLocal ·Ç UIThread£¬³ÖÓÐµÄ runQueue ²»»á×ß performTraversals Ïû·Ñµô¡£

¶¶ÒôÕâ±ß´óÁ¿Ê¹ÓÃÁËÒì²½ UI ¿ò¼ÜÀ´ÓÅ»¯äÖȾÐÔÄÜ£¬¿ò¼ÜÄÚ²¿ÓÉÒ»¸ö HandlerThread Çý¶¯£¬ÍêÈ«·ûºÏÉÏÊöÌõ¼þ¡£Õë¶Ô¸ÃÎÊÌ⣬ÎÒÃÇͨ¹ý·´Éä»ñÈ¡·ÇÖ÷Ïß³ÌµÄ ThreadLocal£¬ÔÚÿ´ÎÒì²½äÖȾÍêÖ÷¶¯ÇåÀíÄÚ²¿µÄ RunQueue¡£

ͼ 13. ·´ÉäÇåÀíÁ÷³Ì

ÁíÍ⣬Google ÔÚ 6.0 ÉÏÒ²ÐÞ¸´ÁË notifyViewAccessisbilityStateChangeIfNeeded µÄÅжϲ»ÑϽ÷ÎÊÌâ¡£

ÄÚ´æÐ¹Â©¶µµ×

´óÁ¿µÄÄÚ´æÐ¹Â©£¬Èç¹ûÎÒÃǶ¼¿¿ÍƽøÑз¢½â¾ö£¬¾­³£»á³öÏÖÉú²ú´óÓÚÏû·ÑµÄÇé¿ö£¬Õë¶ÔÕâЩδ±»Ïû·ÑµÄÄÚ´æÐ¹Â©ÎÒÃÇÔÚ¿Í»§¶Ë×öÁË¼à¿ØºÍÖ¹Ë𣬽« onDestory µÄ Activity Ìí¼Óµ½ WeakRerefrence ÖУ¬ÑÓ³Ù 60s ¼à¿ØÊÇ·ñ»ØÊÕ£¬Î´»ØÊÕÔòÖ÷¶¯ÊÍ·Åй©µÄ Activity ³ÖÓÐµÄ ViewTree µÄ±³¾°Í¼ºÍ ImageView ͼƬ¡£

´ó¶ÔÏó

Ö÷Òª¶ÔÈýÖÖÀàÐ͵Ĵó¶ÔÏó½øÐÐÓÅ»¯

È«¾Ö»º´æ£ºÕë¶ÔÈ«¾Ö»º´æÎÒÃǰ´ÐèÊͷźͽµ¼¶Á˲»ÐèÒªµÄ»º´æ£¬¾¡Á¿Ê¹ÓÃÈõÒýÓôúÌæÇ¿ÒýÓùØÏµ£¬±ÈÈçÕë¶ÔƵ·±Ð¹Â©µÄ EventBus ÎÒÃǽ«ÄÚ²¿µÄ¶©ÔÄÕß¹ØÏµ¸ÄΪÈõÒýÓýâ¾öÁË´óÁ¿µÄ EventBus й©¡£

ϵͳ´ó¶ÔÏó£ºÏµÍ³´ó¶ÔÏóÈç PreloadDrawable¡¢JarFile ÎÒÃÇͨ¹ýÔ´Âë·ÖÎöÈ·¶¨Ö÷¶¯ÊͷŲ¢²»¸ÉÈÅÔ­ÓÐÂß¼­£¬ÔÚÆô¶¯Íê³É»òÔÚÄÚ´æ´¥¶¥Ê±Ö÷¶¯·´ÉäÊÍ·Å¡£

¶¯»­£ºÓÃÔ­Éú¶¯»­´úÌæÁËÄÚ´æÕ¼ÓýϴóµÄÖ¡¶¯»­£¬²¢¶Ô Lottie ¶¯»­Ð¹Â©×öÁËÊÖ¶¯ÊÍ·Å¡£

ͼ 14. ´ó¶ÔÏóÓÅ»¯µã

С¶ÔÏó

С¶ÔÏóÓÅ»¯ÎÒÃǼ¯ÖÐÔÚ×Ö¶ÎÓÅ»¯¡¢ÒµÎñÓÅ»¯¡¢»º´æÓÅ»¯Èý¸öγ¶È£¬²»Í¬µÄγ¶ÈÓв»Í¬µÄÓÅ»¯²ßÂÔ¡£

ͼ 15. С¶ÔÏóÓÅ»¯Ë¼Â·

ͨÓÃÀàÓÅ»¯

ÔÚ¶¶ÒôµÄÒµÎñÖУ¬ÊÓÆµÊÇ×îºËÐÄÇÒͨÓÃµÄ Model£¬¶¶ÒôÒµÎñ²ãµÄÊý¾Ý´æ´¢·ÖÉ¢ÔÚ¸÷¸öÒµÎñά»¤Á˸÷×ÔÊÓÆµµÄ Model£¬Model ±¾ÉíÓÉÓÚ¾ÛºÏÁ˸÷¸öÒµÎñÐèÒªµÄÊôÐԺܶർÖµ¥¸öʵÀýÄÚ´æÕ¼ÓþͲ»µÍ£¬Ëæ×ÅÓû§Ê¹Óùý³ÌʵÀýÔö³¤ÄÚ´æÕ¼ÓÃÔ½À´Ô½´ó¡£¶Ô Model ±¾ÉíÎÒÃÇ¿ÉÒÔ´ÓÊôÐÔÓÅ»¯ºÍ²ð·ÖÕâÁ½ÖÖ˼·À´ÓÅ»¯¡£

×Ö¶ÎÓÅ»¯£ºÕë¶ÔÒ»´ÎÐÔµÄÊôÐÔ×ֶΣ¬ÔÚʹÓÃÍêÖ®ºó¼°Ê±ÇåÀíµô»º´æ£¬±ÈÈçÔÚÊÓÆµ Model ÄÚ²¿´æÔÚÒ»¸ö Json ¶ÔÏó£¬ÔÚ·´ÐòÁÐÍê³ÉÖ®ºó Json ¶ÔÏó¾ÍûÓÐʹÓüÛÖµÁË£¬¿ÉÒÔ¼°Ê±ÇåÀí¡£

Àà²ð·Ö£ºÕë¶ÔͨÓà Model ÈßÔÓ¹ý¶àµÄÒµÎñÊôÐÔ£¬³¢ÊÔ¶Ô Model ±¾Éí½øÐÐÖÎÀí£¬½«¸÷¸öÒµÎñÏßÐèÒªÓõ½µÄÊôÐÔ½øÐÐÊáÀí£¬½« Model ²ð·Ö³É¶à¸öÒµÎñ Model ºÍÒ»¸öͨÓà Model£¬²ÉÓÃ×éºÏµÄ·½Ê½Èø÷¸öÒµÎñÏß×îС»¯ÒÀÀµ×Ô¼ºµÄÒµÎñ Model£¬¼õÉÙ´óÔÓ»â Model ²»±ØÒªµÄÄÚ´æÀË·Ñ¡£

ÒµÎñÓÅ»¯

°´Ðè¼ÓÔØ£º¶¶ÒôÕâ±ß IM »áÈ«¾Ö±£´æ»á»°£¬App Æô¶¯Ê±»áÒ»´ÎÐÔ Load ËùÓлỰ£¬µ±Óû§µÄ»á»°¹ý¶àʱÏàӦȫ¾ÖÕ¼ÓõÄÄÚ´æ¾Í»á½Ï´ó£¬ÎªÁ˽â¾ö¸ÃÎÊÌ⣬»á»°Áбí·ÖÁ½´Î¼ÓÔØ£¬Ê×´ÎÖ»¼ÓÔØÒ»¶¨ÊýÁ¿µ½Äڴ棬ÐèҪʱÔÙ¼ÓÔØÈ«²¿¡£

Äڴ滺´æÏÞÖÆ»òÇåÀí£ºÊ×Ò³ÍÆ¼öÁбíµÄÿһ´Î Loadmore ²Ù×÷£¬¶¼²»»áÇåÀí֮ǰ»º´æÆðÀ´µÄÊÓÆµ¶ÔÏ󣬵¼ÖÂÓû§³¤Ê±¼äÍ£ÁôÔÚÍÆ¼ö Feed ʱ£¬»º´æÆðÀ´µÄÊÓÆµ¶ÔÏó¹ý¶à»áµ¼ÖÂÄÚ´æ·½ÃæµÄѹÁ¦¡£ÔÚͨ¹ýʵÑéÑéÖ¤²»»á¶ÔÒµÎñ²úÉú¸ºÃæÓ°ÏìÇé¿ö϶ÔÊ×Ò³µÄ»º´æ½øÐÐÁËÒ»¶¨ÊýÁ¿µÄÏÞÖÆÀ´¼õСÄÚ´æÑ¹Á¦¡£

»º´æÓÅ»¯

ÉÏÃæÌáµ½µÄÊÓÆµ Model£¬¶¶Òô×îÔçʹÓà Manager À´¹ÜÀíͨÓõÄÊÓÆµÊµÀý¡£Manager ʹÓà HashMap ´æ´¢ÁËËùÓеÄÊÓÆµ¶ÔÏó£¬×î³õµÄ·½°¸ÀïÃæÃ»ÓжÔÄÚ´æ´óС½øÐÐÏÞÖÆÇÒûÓÐÇå³ýÂß¼­£¬Ëæ×ÅʹÓÃʱ¼äµÄÔö¼Ó¶ø²»¶ÏÅòÕÍ£¬×îÖÕ³öÏÖ OOM Òì³£¡£ÎªÁ˽â¾öÊÓÆµ Model ÎÞÏÞÅòÕ͵ÄÎÊÌâÉè¼ÆÁËÒ»Ì×»º´æ¿ò¼ÜÖ÷ÒªÁ÷³ÌÈçÏ£º

ͼ 16. ÊÓÆµ»º´æ¿ò¼Ü

ʹÓà LRU »º´æ»úÖÆÀ´»º´æÊÓÆµ¶ÔÏó¡£ÔÚÄÚ´æÖлº´æ×î½üʹÓÃµÄ 100 ¸öÊÓÆµ¶ÔÏ󣬵±ÊÓÆµ¶ÔÏó´ÓÄڴ滺´æÖÐÒÆ³ýʱ£¬½«Æä»º´æÖÁ´ÅÅÌÖС£ÔÚ»ñÈ¡ÊÓÆµ¶ÔÏóʱ£¬Ê×ÏÈ´ÓÄÚ´æÖлñÈ¡£¬ÈôÄÚ´æÖÐûÓлº´æ¸Ã¶ÔÏó£¬Ôò´Ó´ÅÅÌ»º´æÖлñÈ¡¡£ÔÚÍ˳ö App ʱ£¬Çå³ý Manager µÄ´ÅÅÌ»º´æ£¬±ÜÃâ´ÅÅ̿ռäÕ¼Óò»¶ÏÔö³¤¡£

ͼƬ

¹ØÓÚͼƬÓÅ»¯£¬ÎÒÃÇÖ÷Òª´ÓͼƬ¿âµÄ¹ÜÀíºÍͼƬ±¾ÉíÓÅ»¯Á½¸ö·½ÃæË¼¿¼¡£Í¬Ê±¶Ô²»ºÏÀíµÄͼƬʹÓÃÒ²×öÁ˶µµ×ºÍ¼à¿Ø¡£

ͼƬ¿â

Õë¶ÔÓ¦ÓÃÄÚͼƬµÄʹÓÃ×´¿ö¶ÔͼƬ¿âÉèÖÃÁ˺ÏÀíµÄ»º´æ£¬Í¬Ê±ÔÚÓ¦Óà or ϵͳÄÚ´æ³Ô½ôµÄÇé¿öÏÂÖ÷¶¯ÊÍ·ÅͼƬ»º´æ¡£

ͼƬ×ÔÉíÓÅ»¯

ÎÒÃÇÖªµÀͼƬÄÚ´æ´óС¹«Ê½ = ͼƬ·Ö±æÂÊ * ÿ¸öÏñËØµãµÄ´óС¡£

ͼƬ·Ö±æÂÊÎÒÃÇͨ¹ýÉèÖúÏÀíµÄ²ÉÑùÀ´¼õÉÙ²»±ØÒªµÄÏñËØÀË·Ñ¡£

//¿ªÆô²ÉÑù
ImagePipelineConfig config = ImagePipelineConfig.newBuilder(context)
.setDownsampleEnabled(true)
.build();
Fresco.initialize(context, config);

//ÇëÇóͼƬʱ£¬´«ÈëresizeµÄ´óС£¬Ò»°ãÖ±½ÓÈ¡ViewµÄ¿í¸ß
ImageRequest request = ImageRequestBuilder.newBuilderWithSource (uri)
.setResizeOptions (new ResizeOptions(50, 50))
.build(); mSimpleDraweeView.setController(
Fresco.newDraweeControllerBuilder()
.setOldController (mSimpleDraweeView.getController())
.setImageRequest (request)
.build());

¶øµ¥¸öÏñËØ´óС£¬ÎÒÃÇͨ¹ýÌæ»»ÏµÍ³ drawable ĬÈÏÉ«²ÊͨµÀ£¬½«²¿·ÖûÓÐ͸Ã÷ͨµÀµÄͼƬ¸ñʽÓÉ ARGB_8888 Ìæ»»Îª RGB565£¬ÔÚͼƬÖÊÁ¿ÉϵÄËðʧ¼¸ºõÈâÑÛ²»¿É¼û£¬¶øÔÚÄÚ´æÉÏ¿ÉÒÔÖ±½Ó½Úʡһ°ë¡£

ͼƬ¶µµ×

Õë¶ÔÒò activity¡¢fragment й©µ¼ÖµÄͼƬй©£¬ÎÒÃÇÔÚ onDetachedFromWindow ʱ»ú½øÐÐÁË¼à¿ØºÍ¶µµ×£¬¾ßÌåÁ÷³ÌÈçÏ£º

ͼ 17. ͼƬ¶µµ×Á÷³Ì

ͼƬ¼à¿Ø

¹ØÓÚ¶Ô²»ºÏÀíµÄ´óͼ or ͼƬʹÓÃÎÒÃÇÔÚ×Ö½ÚÂë²ãÃæ½øÐÐÁËÀ¹½ØºÍ¼à¿Ø£¬ÔÚÔ­Éú Bitmap or ͼƬ¿â´´½¨Ê±»ú¼Ç¼ͼƬÐÅÏ¢£¬¶Ô²»ºÏÀíµÄ´óͼ½øÐÐÉϱ¨£»ÁíÍâÔÚ ImageView µÄÉèÖùý³ÌÖÐÕë¶Ô Bitmap Ô¶³¬¹ý view ±¾Éí³¬¹ý´óСµÄ³¡¾°Ò²½øÐÐÁ˼ǼºÍÉϱ¨¡£

ͼ 18. ͼƬ×Ö½ÚÂë¼à¿Ø·½°¸

¸ü¶à˼¿¼

ÊDz»Êǽâ¾öÁË OOM ÄÚ´æÎÊÌâ¾Í¸æÒ»¶ÎÂäÁËÄØ£¿×÷Ϊһֻ׷Çó¼«ÖµÄÍŶӣ¬ÎÒÃdzýÁ˽â¾ö¾²Ì¬µÄÄÚ´æÕ¼ÓÃÍâÒ²×ÔÑÐÁË Kenzo£¨Memory Insight£©¹¤¾ß³¢ÊÔ½â¾ö¶¯Ì¬ÄÚ´æ·ÖÅäÔì³ÉµÄ GC ¿¨¶Ù¡£

Kenzo Ô­Àí

Kenzo ²ÉÓà JVMTI Íê³É¶ÔÄÚ´æ¼à¿Ø¹¤×÷£¬JVMTI£¨JVM Tool Interface£©ÊÇ Java ÐéÄâ»úËùÌṩµÄ native ±à³Ì½Ó¿Ú¡£JVMTI ¿ª·¢Ê±£¬Ó¦Óý¨Á¢Ò»¸ö Agent ʹÓà JVMTI£¬¿ÉÒÔʹÓà JVMTI º¯Êý£¬ÉèÖûص÷º¯Êý£¬²¢´Ó Java ÐéÄâ»úÖеõ½µ±Ç°µÄÔËÐÐ̬ÐÅÏ¢£¬²¢×÷³ö×Ô¼ºµÄÒµÎñÅжϡ£

ͼ 19. Agent ʱÐòͼ

Jvmti SetEventCallbacks ·½·¨¿ÉÒÔÉèÖÃÄ¿±êÐéÄâ»úÄÚ²¿Ê¼þ»Øµ÷£¬¿ÉÒÔ¸ù¾Ý jvmtiCapabilities Ö§³ÖµÄÄÜÁ¦ºÍÎÒÃǹØ×¢µÄʼþÀ´¶¨ÒåÐèÒª hook µÄʼþ¡£

Kenzo ²ÉÓà Jvmti Íê³ÉÈçÏÂʼþ»Øµ÷£º

Àà¼ÓÔØ×¼±¸Ê¼þ -> ¼à¿ØÀà¼ÓÔØ

ClassPrepare£ºÄ³¸öÀàµÄ×¼±¸½×¶ÎÍê³É¡£

GC -> ¼à¿Ø GC ʼþÓëʱ¼ä

GarbageCollectionStart£ºGC Æô¶¯Ê±¡£

GarbageCollectionFinish£ºGC ½áÊøºó¡£

¶ÔÏóʼþ -> ¼à¿ØÄÚ´æ·ÖÅä

ObjectFree£ºGC ÊÍ·ÅÒ»¸ö¶ÔÏóʱ¡£

VMObjectAlloc£ºÐéÄâ»ú·ÖÅäÒ»¸ö¶ÔÏóµÄʱºò¡£

¿ò¼ÜÉè¼Æ

Kenzo ÕûÌå·ÖΪÁ½¸ö²¿·Ö£º

Éú²ú¶Ë

²É¼¯ÄÚ´æÊý¾Ý

ÒÔ sdk ÐÎʽ¼¯³Éµ½ËÞÖ÷ App

Ïû·Ñ¶Ë

´¦ÀíÉú²ú¶ËµÄÊý¾Ý

ÊäÈë Kenzo ¼à¿ØµÄÄÚ´æÊý¾Ý

Êä³ö¿ÉÊÓ»¯±¨±í

ͼ 20. kenzo ¿ò¼Ü

Éú²ú¶ËÖ÷ÒªÒÔ Java ½øÐÐ API µ÷Óã¬C++Íê³Éµ×²ã¼ì²âÂß¼­£¬Í¨¹ý JNI Íê³Éµ×²ãÂß¼­¿ØÖÆ¡£

Ïû·Ñ¶ËÖ÷ÒªÒÔ Python Íê³ÉÊý¾ÝµÄ½âÎö¡¢ÊÓͼºÏ³É£¬ÒÔ HTML Íê³ÉÒ³ÃæÄÚÈÝչʾ¡£

¹¤×÷Á÷

ͼ 21. kenzo ¿ò¼Ü

¿ÉÊÓ»¯Õ¹Ê¾

22. kenzo ¾ÛºÏչʾ

Æô¶¯½×¶ÎÄÚ´æ¹éÒò

»ùÓÚ¶¯Ì¬ÄÚ´æ¼à¿ØÎÒÃǶÔ×îΪºËÐĵįô¶¯³¡¾°µÄÄÚ´æ·ÖÅä½øÐÐÁ˹éÒò·ÖÎö£¬ÓÅ»¯ÁËһЩͷ²¿µÄÄÚ´æ½Úµã·ÖÅä:

ͼ 23.Æô¶¯½×¶ÎÄÚ´æ½Úµã¹éÒò

ÁíÍâÎÒÃÇÒ²·¢ÏÖÆô¶¯½×¶Î´æÔÚ´óÁ¿µÄ×Ö·û´®Æ´½Ó²Ù×÷£¬ËäÈ»±àÒëÆ÷ÒѾ­ÓÅ»¯³ÉÁË StringBuider append£¬µ«ÊÇÉîÈë StringBuider Ô´Âë·ÖÎöÈÔÔÚ´æÔÚ´óÁ¿µÄ¶¯Ì¬À©Èݶ¯×÷£¨System.copy£©£¬ÎªÁËÓÅ»¯¸ßƵ³¡¾°´¥·¢¶¯Ì¬À©ÈݵÄÐÔÄÜËðºÄ£¬ÔÚ StringBuilder ÔÚ appendµÄʱºò£¬²»Ö±½ÓÍù char[]ÀïÈû¶«Î÷£¬¶øÊÇÏÈÄÃÒ»¸ö String[]°ÑËüÃǶ¼´æÆðÀ´£¬µ½ÁË×îºó²Å°ÑËùÓÐ String µÄ length ¼ÓÆðÀ´£¬¹¹ÔìÒ»¸öºÏÀí³¤¶ÈµÄ StringBuilder¡£Í¨¹ýʹÓñàÒëʱ×Ö½ÚÂëÌæ»»µÄ·½Ê½£¬Ìæ»»ËùÓÐ StringBuilder µÄ append ·½·¨Ê¹ÓÃ×Ô¶¨ÒåʵÏÖ£¬ÓÅ»¯ºóÊ״ΰ²×°Ê×Ò³ Feed »¬¶¯ 1min µÄ FPS ÌáÉý 1 Ö¡/S£¬·ÇÊ״ΰ²×°Æô¶¯£¬»¬¶¯ 1min µÄ FPS ÌáÉý 0.6 Ö¡/S¡£

 
   
3356 ´Îä¯ÀÀ       28
Ïà¹ØÎÄÕÂ

Java΢·þÎñÐÂÉú´úÖ®Nacos
ÉîÈëÀí½âJavaÖеÄÈÝÆ÷
JavaÈÝÆ÷Ïê½â
Java´úÂëÖÊÁ¿¼ì²é¹¤¾ß¼°Ê¹Óð¸Àý
Ïà¹ØÎĵµ

JavaÐÔÄÜÓÅ»¯
Spring¿ò¼Ü
SSM¿ò¼Ü¼òµ¥¼òÉÜ
´ÓÁ㿪ʼѧjava±à³Ì¾­µä
Ïà¹Ø¿Î³Ì

¸ßÐÔÄÜJava±à³ÌÓëϵͳÐÔÄÜÓÅ»¯
JavaEE¼Ü¹¹¡¢ Éè¼ÆÄ£Ê½¼°ÐÔÄܵ÷ÓÅ
Java±à³Ì»ù´¡µ½Ó¦Óÿª·¢
JAVAÐéÄâ»úÔ­ÀíÆÊÎö
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]
 
×îÐÂÎÄÕÂ
JavaÐéÄâ»ú¼Ü¹¹
JVM¡ª¡ªJavaÐéÄâ»ú¼Ü¹¹
JavaÈÝÆ÷Ïê½â
Java½ø½×--ÉîÈëÀí½âArrayListʵÏÖÔ­Àí
Java²¢·¢ÈÝÆ÷£¬µ×²ãÔ­ÀíÉîÈë·ÖÎö
×îпγÌ
java±à³Ì»ù´¡µ½Ó¦Óÿª·¢
JavaEE¼Ü¹¹¡¢ Éè¼ÆÄ£Ê½¼°ÐÔÄܵ÷ÓÅ
¸ßÐÔÄÜJava±à³ÌÓëϵͳÐÔÄÜÓÅ»¯
SpringBoot&Cloud¡¢JavaSSM¿ò¼Ü
Spring Boot Åàѵ
³É¹¦°¸Àý
¹úÄÚÖªÃûÒøÐÐ Spring+SpringBoot+Cloud+MVC
±±¾© Java±à³Ì»ù´¡ÓëÍøÒ³¿ª·¢»ù´¡
±±¾© Struts+Spring
»ªÏÄ»ù½ð ActiveMQ Ô­Àí
ijÃñº½¹« Java»ù´¡±à³Ìµ½Ó¦Óÿª·¢