±à¼ÍƼö: |
±¾ÎÄ´Ó¶¶Òô
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¡£
.jpg)
ͼ 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¡£ |