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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
Android GC Ô­Àí̽¾¿ UI
 
×÷Õߣº³ÂêÅÈ« À´Ô´£ºweixin.qq.com ·¢²¼ÓÚ£º 2017-5-8
  1457  次浏览      27
 

µ¼Óï

Ïëдһƪ¹ØÓÚ android GC µÄÏë·¨À´Ô´ÓÚ×·²éÒ»¸ö÷È×åÊÖ»úͼƬ»¬¶¯¿¨¶ÙÎÊÌ⣬ÓÉÓÚ²»¶ÏµÄ GC µ¼ÖµĶªÖ¡¿¨¶ÙµÄÎÊÌâÈÃÎÒÃÇÏëÁ˺ܶ෽°¸È¥½â¾ö£¬ËùÒԾʹòËãÏêϸµÄ¿´¿´ÄÚ´æ·ÖÅäºÍ GC µÄÔ­Àí£¬ÎªÊ²Ã´»á²»¶ÏµÄ GC£¬GC ALLOC ºÍ GC COCURRENT ÓÐÊ²Ã´Çø±ð£¬Äܲ»ÄÜÏë°ì·¨À©´ó¶ÑÄÚ´æ¼õÉÙ GC µÄƵ´ÎµÈµÈ¡£

1¡¢JVM ÄÚ´æ»ØÊÕ»úÖÆ

1.1 »ØÊÕËã·¨

±ê¼Ç»ØÊÕËã·¨£¨Mark and Sweep GC£©

´Ó¡±GC Roots¡±¼¯ºÏ¿ªÊ¼£¬½«ÄÚ´æÕû¸ö±éÀúÒ»´Î£¬±£ÁôËùÓпÉÒÔ±» GC Roots Ö±½Ó»ò¼ä½ÓÒýÓõ½µÄ¶ÔÏ󣬶øÊ£ÏµĶÔÏó¶¼µ±×÷À¬»ø¶Ô´ý²¢»ØÊÕ£¬Õâ¸öËã·¨ÐèÒªÖжϽø³ÌÄÚÆäËü×é¼þµÄÖ´Ðв¢ÇÒ¿ÉÄܲúÉúÄÚ´æË鯬

¸´ÖÆËã·¨ (Copying£©

½«ÏÖÓеÄÄÚ´æ¿Õ¼ä·ÖΪÁ½¿ì£¬Ã¿´ÎֻʹÓÃÆäÖÐÒ»¿é£¬ÔÚÀ¬»ø»ØÊÕʱ½«ÕýÔÚʹÓõÄÄÚ´æÖеĴæ»î¶ÔÏó¸´ÖƵ½Î´±»Ê¹ÓõÄÄÚ´æ¿éÖУ¬Ö®ºó£¬Çå³ýÕýÔÚʹÓõÄÄÚ´æ¿éÖеÄËùÓжÔÏ󣬽»»»Á½¸öÄÚ´æµÄ½ÇÉ«£¬Íê³ÉÀ¬»ø»ØÊÕ¡£

±ê¼Ç-ѹËõËã·¨ (Mark-Compact)

ÏÈÐèÒª´Ó¸ù½Úµã¿ªÊ¼¶ÔËùÓпɴï¶ÔÏó×öÒ»´Î±ê¼Ç£¬µ«Ö®ºó£¬Ëü²¢²»¼òµ¥µØÇåÀíδ±ê¼ÇµÄ¶ÔÏ󣬶øÊǽ«ËùÓеĴæ»î¶ÔÏóѹËõµ½ÄÚ´æµÄÒ»¶Ë¡£Ö®ºó£¬ÇåÀí±ß½çÍâËùÓеĿռ䡣ÕâÖÖ·½·¨¼È±ÜÃâÁËË鯬µÄ²úÉú£¬ÓÖ²»ÐèÒªÁ½¿éÏàͬµÄÄÚ´æ¿Õ¼ä£¬Òò´Ë£¬ÆäÐԼ۱ȱȽϸߡ£

·Ö´ú

½«ËùÓеÄн¨¶ÔÏó¶¼·ÅÈë³ÆÎªÄêÇá´úµÄÄÚ´æÇøÓò£¬ÄêÇá´úµÄÌØµãÊǶÔÏó»áºÜ¿ì»ØÊÕ£¬Òò´Ë£¬ÔÚÄêÇá´ú¾ÍÑ¡ÔñЧÂʽϸߵĸ´ÖÆËã·¨¡£µ±Ò»¸ö¶ÔÏó¾­¹ý¼¸´Î»ØÊÕºóÒÀÈ»´æ»î£¬¶ÔÏó¾Í»á±»·ÅÈë³ÆÎªÀÏÉú´úµÄÄÚ´æ¿Õ¼ä¡£¶ÔÓÚÐÂÉú´úÊÊÓÃÓÚ¸´ÖÆËã·¨£¬¶ø¶ÔÓÚÀÏÄê´úÔò²ÉÈ¡±ê¼Ç-ѹËõËã·¨¡£

1.2 ¸´Öƺͱê¼Ç-ѹËõËã·¨µÄÇø±ð

Õ§Ò»¿´ÕâÁ½¸öËã·¨ËÆºõ²¢Ã»Óжà´óµÄÇø±ð£¬¶¼ÊDZê¼ÇÁËÈ»ºóŲµ½ÁíÍâµÄÄÚ´æµØÖ·½øÐлØÊÕ£¬ÄÇΪʲô²»Í¬µÄ·Ö´úҪʹÓò»Í¬µÄ»ØÊÕËã·¨ÄØ£¿

Æäʵ 2 Õß×î´óµÄÇø±ðÔÚÓÚǰÕßÊÇÓÿռ任ʱ¼äºóÕßÔòÊÇÓÃʱ¼ä»»¿Õ¼ä¡£

ǰÕßµÄÔÚ¹¤×÷µÄʱºòÊDz»Ã»ÓжÀÁ¢µÄ¡°mark¡±Óë¡°copy¡±½×¶ÎµÄ£¬¶øÊǺÏÔÚÒ»Æð×öÒ»¸ö¶¯×÷£¬¾Í½Ð scavenge£¨»ò evacuate£¬»òÕ߾ͽРcopy£©¡£Ò²¾ÍÊÇ˵£¬Ã¿·¢ÏÖÒ»¸öÕâ´ÎÊÕ¼¯ÖÐÉÐδ·ÃÎʹýµÄ»î¶ÔÏó¾ÍÖ±½Ó copy µ½Ðµط½£¬Í¬Ê±ÉèÖà forwarding pointer¡£ÕâÑùµÄ¹¤×÷·½Ê½¾ÍÐèÒª¶àÒ»·Ý¿Õ¼ä¡£

ºóÕßÔÚ¹¤×÷µÄʱºòÔòÐèÒª·Ö±ðµÄ mark Óë compact ½×¶Î£¬mark ½×¶ÎÓÃÀ´·¢ÏÖ²¢±ê¼ÇËùÓлîµÄ¶ÔÏó£¬È»ºó compact ½×¶Î²ÅÒÆ¶¯¶ÔÏóÀ´´ïµ½ compact µÄÄ¿µÄ¡£Èç¹û compact ·½Ê½ÊÇ sliding compaction£¬ÔòÔÚ mark Ö®ºó¾Í¿ÉÒÔ°´Ë³ÐòÒ»¸ö¸ö¶ÔÏó¡°»¬¶¯¡±µ½¿Õ¼äµÄijһ²à¡£ÒòΪÒѾ­ÏȱéÀúÁËÕû¸ö¿Õ¼äÀïµÄ¶ÔÏóͼ£¬ÖªµÀËùÓеĻî¶ÔÏóÁË£¬ËùÒÔÒÆ¶¯µÄʱºò¾Í¿ÉÒÔÔÚͬһ¸ö¿Õ¼äÄÚ¶ø²»ÐèÒª¶àÒ»·Ý¿Õ¼ä¡£

ËùÒÔÐÂÉú´úµÄ»ØÊÕ»á¸ü¿ìÒ»µã£¬ÀÏÄê´úµÄ»ØÊÕÔò»áÐèÒª¸ü³¤Ê±¼ä£¬Í¬Ê±Ñ¹Ëõ½×¶ÎÊÇ»áÔÝÍ£Ó¦Óõģ¬ËùÒÔ¸øÎÒÃÇÓ¦¸Ã¾¡Á¿±ÜÃâ¶ÔÏó³öÏÖÔÚÀÏÄê´ú¡£

2¡¢Dalvik ÐéÄâ»ú

2.1 java ¶Ñ

Java ¶Ñʵ¼ÊÉÏÊÇÓÉÒ»¸ö Active ¶ÑºÍÒ»¸ö Zygote ¶Ñ×é³ÉµÄ£¬ÆäÖУ¬Zygote ¶ÑÓÃÀ´¹ÜÀí Zygote ½ø³ÌÔÚÆô¶¯¹ý³ÌÖÐÔ¤¼ÓÔØºÍ´´½¨µÄ¸÷ÖÖ¶ÔÏ󣬶ø Active ¶ÑÊÇÔÚ Zygote ½ø³Ì fork µÚÒ»¸ö×Ó½ø³Ì֮ǰ´´½¨µÄ¡£ÒÔºóÆô¶¯µÄËùÓÐÓ¦ÓóÌÐò½ø³ÌÊDZ» Zygote ½ø³Ì fork ³öÀ´µÄ£¬²¢¶¼³ÖÓÐÒ»¸ö×Ô¼ºµÄ Dalvik ÐéÄâ»ú¡£ÔÚ´´½¨Ó¦ÓóÌÐòµÄ¹ý³ÌÖУ¬Dalvik ÐéÄâ»ú²ÉÓà COW ²ßÂÔ¸´ÖÆ Zygote ½ø³ÌµÄµØÖ·¿Õ¼ä¡£

COW ²ßÂÔ£ºÒ»¿ªÊ¼µÄʱºò£¨Î´¸´ÖÆ Zygote ½ø³ÌµÄµØÖ·¿Õ¼äµÄʱºò£©£¬Ó¦ÓóÌÐò½ø³ÌºÍ Zygote ½ø³Ì¹²ÏíÁËͬһ¸öÓÃÀ´·ÖÅä¶ÔÏóµÄ¶Ñ¡£µ± Zygote ½ø³Ì»òÕßÓ¦ÓóÌÐò½ø³Ì¶Ô¸Ã¶Ñ½øÐÐд²Ù×÷ʱ£¬Äں˾ͻáÖ´ÐÐÕæÕýµÄ¿½±´²Ù×÷£¬Ê¹µÃ Zygote ½ø³ÌºÍÓ¦ÓóÌÐò½ø³Ì·Ö±ðÓµÓÐ×Ô¼ºµÄÒ»·Ý¿½±´£¬Õâ¾ÍÊÇËùνµÄ COW¡£ÒòΪ copy ÊÇÊ®·ÖºÄʱµÄ£¬ËùÒÔ±ØÐ뾡Á¿±ÜÃâ copy »òÕß¾¡Á¿ÉÙµÄ copy¡£

ΪÁËʵÏÖÕâ¸öÄ¿µÄ£¬µ±´´½¨µÚÒ»¸öÓ¦ÓóÌÐò½ø³Ìʱ£¬»á½«ÒѾ­Ê¹ÓÃÁ˵ÄÄDz¿·Ö¶ÑÄÚ´æ»®·ÖΪһ²¿·Ö£¬»¹Ã»ÓÐʹÓõĶÑÄÚ´æ»®·ÖΪÁíÍâÒ»²¿·Ö¡£Ç°Õ߾ͳÆÎª Zygote ¶Ñ£¬ºóÕ߾ͳÆÎª Active ¶Ñ¡£ÕâÑùÖ»Ðè°Ñ zygote ¶ÑÖеÄÄÚÈݸ´ÖƸøÓ¦ÓóÌÐò½ø³Ì¾Í¿ÉÒÔÁË¡£ÒÔºóÎÞÂÛÊÇ Zygote ½ø³Ì£¬»¹ÊÇÓ¦ÓóÌÐò½ø³Ì£¬µ±ËüÃÇÐèÒª·ÖÅä¶ÔÏóµÄʱºò£¬¶¼ÔÚ Active ¶ÑÉϽøÐС£ÕâÑù¾Í¿ÉÒÔʹµÃ Zygote ¶Ñ¾¡¿ÉÄÜÉٵر»Ö´ÐÐд²Ù×÷£¬Òò¶ø¾Í¿ÉÒÔ¼õÉÙÖ´ÐÐдʱ¿½±´µÄ²Ù×÷¡£ÔÚ Zygote ¶ÑÀïÃæ·ÖÅäµÄ¶ÔÏóÆäʵÖ÷Òª¾ÍÊÇ Zygote ½ø³ÌÔÚÆô¶¯¹ý³ÌÖÐÔ¤¼ÓÔØµÄÀà¡¢×ÊÔ´ºÍ¶ÔÏóÁË¡£ÕâÒâζ×ÅÕâЩԤ¼ÓÔØµÄÀà¡¢×ÊÔ´ºÍ¶ÔÏó¿ÉÒÔÔÚ Zygote ½ø³ÌºÍÓ¦ÓóÌÐò½ø³ÌÖÐ×öµ½³¤ÆÚ¹²Ïí¡£ÕâÑù¼ÈÄܼõÉÙ¿½±´²Ù×÷£¬»¹ÄܼõÉÙ¶ÔÄÚ´æµÄÐèÇó¡£

2.2 ºÍ GC ÓйصÄһЩָ±ê

¼ÇµÃÎÒÃÇ֮ǰÔÚÓÅ»¯÷È×åijÊÖ»úµÄ gc ¿¨¶ÙÎÊÌâʱ£¬·¢ÏÖËûºÜÈÝÒ×´¥·¢ GC_FOR_MALLOC£¬Õâ¸ö GC Àà±ðºóÐø»á˵µ½£¬ÊÇ·ÖÅä¶ÔÏóÄÚ´æ²»×ãʱµ¼Öµġ£¿ÉÊÇÎÒÃÇÓÖÉèÖÃÁ˺ܴóµÄ¶Ñ Size Ϊʲô»¹»áÄÚ´æ²»¹»ÄØ£¬ÕâÀïÐèÒªÁ˽âÒÔϼ¸¸ö¸ÅÄ·Ö±ðÊÇ Java ¶ÑµÄÆðʼ´óС£¨Starting Size£©¡¢×î´óÖµ£¨Maximum Size£©ºÍÔö³¤ÉÏÏÞÖµ£¨Growth Limit£©¡£

ÔÚÆô¶¯ Dalvik ÐéÄâ»úµÄʱºò£¬ÎÒÃÇ¿ÉÒÔ·Ö±ðͨ¹ý-Xms¡¢-XmxºÍ-XX:HeapGrowthLimitÈý¸öÑ¡ÏîÀ´Ö¸¶¨ÉÏÊöÈý¸öÖµ£¬ÒÔÉÏÈý¸öÖµ·Ö±ð±íʾ±íʾ

Starting Size£º Dalvik ÐéÄâ»úÆô¶¯µÄʱºò£¬»áÏÈ·ÖÅäÒ»¿é³õʼµÄ¶ÑÄÚ´æ¸øÐéÄâ»úʹÓá£

Growth Limit£ºÊÇϵͳ¸øÃ¿Ò»¸ö³ÌÐòµÄ×î´ó¶ÑÉÏÏÞ,³¬¹ýÕâ¸öÉÏÏÞ£¬³ÌÐò¾Í»á OOM

Maximum Size£º²»ÊÜ¿ØÇé¿öϵÄ×î´ó¶ÑÄÚ´æ´óС£¬Æðʼ¾ÍÊÇÎÒÃÇÔÚÓà largeheap ÊôÐÔµÄʱºò£¬¿ÉÒÔ´Óϵͳ»ñÈ¡µÄ×î´ó¶Ñ´óС

ͬʱ³ýÁËÉÏÃæµÄÕâ¸öÈý¸öÖ¸±êÍ⣬»¹Óм¸¸öÖ¸±êÒ²ÊÇÖµµÃÎÒÃǹØ×¢µÄ£¬ÄǾÍÊǶÑ×îС¿ÕÏÐÖµ£¨Min Free£©¡¢¶Ñ×î´ó¿ÕÏÐÖµ£¨Max Free£©ºÍ¶ÑÄ¿±êÀûÓÃÂÊ£¨Target Utilization£©¡£¼ÙÉèÔÚijһ´Î GC Ö®ºó£¬´æ»î¶ÔÏóÕ¼ÓÃÄÚ´æµÄ´óСΪ LiveSize£¬ÄÇôÕâʱºò¶ÑµÄÀíÏë´óСӦ¸ÃΪ(LiveSize / U)¡£µ«ÊÇ(LiveSize / U)±ØÐë´óÓÚµÈÓÚ(LiveSize + MinFree)²¢ÇÒСÓÚµÈÓÚ(LiveSize + MaxFree)£¬Ã¿´Î GC ºóÀ¬»ø»ØÊÕÆ÷¶¼»á¾¡Á¿ÈöѵÄÀûÓÃÂÊÍùÄ¿±êÀûÓÃÂÊ¿¿Â£¡£ËùÒÔµ±ÎÒÃdz¢ÊÔÊÖ¶¯È¥Éú³ÉһЩ¼¸°Ù K µÄ¶ÔÏó£¬ÊÔͼȥÀ©´ó¿ÉÓöѴóСµÄʱºò£¬·´¶ø»áµ¼ÖÂÆµ·±µÄ GC£¬ÒòΪÕâЩ¶ÔÏóµÄ·ÖÅä»áµ¼Ö GC£¬¶ø GC ºó»áÈöÑÄÚ´æ»Øµ½ºÏÊʵıÈÀý£¬¶øÎÒÃÇʹÓõľֲ¿±äÁ¿ºÜ¿ì»á±»»ØÊÕÀíÂÛÉÏ´æ»î¶ÔÏó»¹ÊÇÄÇô¶à£¬ÎÒÃǵĶѴóСҲ»áËõ¼õ»ØÀ´ÎÞ·¨´ïµ½À©³äµÄÄ¿µÄ¡£ Óë´ËͬʱÕâÒ²ÊDzúÉú CONCURRENT GC µÄÒ»¸öÒòËØ£¬ºóÎÄÎÒÃÇ»áÏêϸ½²µ½¡£

2.3 GC µÄÀàÐÍ

GC_FOR_MALLOC: ±íʾÊÇÔÚ¶ÑÉÏ·ÖÅä¶ÔÏóʱÄÚ´æ²»×ã´¥·¢µÄ GC¡£

GC_CONCURRENT: µ±ÎÒÃÇÓ¦ÓóÌÐòµÄ¶ÑÄÚ´æ´ïµ½Ò»¶¨Á¿£¬»òÕß¿ÉÒÔÀí½âΪ¿ìÒªÂúµÄʱºò£¬ÏµÍ³»á×Ô¶¯´¥·¢ GC ²Ù×÷À´ÊÍ·ÅÄÚ´æ¡£

GC_EXPLICIT: ±íʾÊÇÓ¦ÓóÌÐòµ÷Óà System.gc¡¢VMRuntime.gc ½Ó¿Ú»òÕßÊÕµ½ SIGUSR1 ÐźÅʱ´¥·¢µÄ GC¡£

GC_BEFORE_OOM: ±íʾÊÇÔÚ×¼±¸Å× OOM Ò쳣֮ǰ½øÐеÄ×îºóŬÁ¦¶ø´¥·¢µÄ GC¡£

ʵ¼ÊÉÏ£¬GC_FOR_MALLOC¡¢GC_CONCURRENT ºÍ GC_BEFORE_OOM ÈýÖÖÀàÐ굀 GC ¶¼ÊÇÔÚ·ÖÅä¶ÔÏóµÄ¹ý³Ì´¥·¢µÄ¡£¶ø²¢·¢ºÍ·Ç²¢·¢ GC µÄÇø±ðÖ÷ÒªÔÚÓÚǰÕßÔÚ GC ¹ý³ÌÖУ¬ÓÐÌõ¼þµØ¹ÒÆðºÍ»½ÐÑ·Ç GC Ị̈߳¬¶øºóÕßÔÚÖ´ÐÐ GC µÄ¹ý³ÌÖУ¬Ò»Ö±¶¼ÊÇ¹ÒÆð·Ç GC Ï̵߳ġ£²¢ÐÐ GC ͨ¹ýÓÐÌõ¼þµØ¹ÒÆðºÍ»½ÐÑ·Ç GC Ị̈߳¬¾Í¿ÉÒÔʹµÃÓ¦ÓóÌÐò»ñµÃ¸üºÃµÄÏìÓ¦ÐÔ¡£µ«ÊÇͬʱ²¢ÐÐ GC ÐèÒª¶àÖ´ÐÐÒ»´Î±ê¼Ç¸ù¼¯¶ÔÏóÒÔ¼°µÝ¹é±ê¼ÇÄÇЩÔÚ GC ¹ý³Ì±»·ÃÎÊÁ˵ĶÔÏóµÄ²Ù×÷£¬ËùÒÔÒ²ÐèÒª»¨·Ñ¸ü¶àµÄ CPU ×ÊÔ´¡£ºóÎÄÔÚ Art µÄ²¢·¢ºÍ·Ç²¢·¢ GC ÖÐÎÒÃÇÒ²»á×ÅÖØËµÃ÷ÏÂÕâÁ½ÕßµÄÇø±ð¡£

2.4 ¶ÔÏóµÄ·ÖÅäºÍ GC ´¥·¢Ê±»ú

µ÷Óú¯Êý dvmHeapSourceAlloc ÔÚ Java ¶ÑÉÏ·ÖÅäÖ¸¶¨´óСµÄÄÚ´æ¡£Èç¹û·ÖÅä³É¹¦£¬ÄÇô¾Í½«·ÖÅäµÃµ½µÄµØÖ·Ö±½Ó·µ»Ø¸øµ÷ÓÃÕßÁË¡£º¯Êý dvmHeapSourceAlloc ÔÚ²»¸Ä±ä Java ¶Ñµ±Ç°´óСµÄǰÌáϽøÐÐÄÚ´æ·ÖÅ䣬ÕâÊÇÊôÓÚÇáÁ¿¼¶µÄÄÚ´æ·ÖÅ䶯×÷¡£

Èç¹ûÉÏÒ»²½ÄÚ´æ·ÖÅäʧ°Ü£¬Õâʱºò¾ÍÐèÒªÖ´ÐÐÒ»´Î GC ÁË¡£²»¹ýÈç¹û GC Ïß³ÌÒѾ­ÔÚÔËÐÐÖУ¬¼´ gDvm.gcHeap->gcRunning µÄÖµµÈÓÚ true£¬ÄÇô¾ÍÖ±½Óµ÷Óú¯Êý dvmWaitForConcurrentGcToComplete µÈµ½ GC Ö´ÐÐÍê³É¾ÍÊÇÁË¡£·ñÔòµÄ»°£¬¾ÍÐèÒªµ÷Óú¯Êý gcForMalloc À´Ö´ÐÐÒ»´Î GC ÁË£¬²ÎÊý false ±íʾ²»Òª»ØÊÕÈíÒýÓöÔÏóÒýÓõĶÔÏó¡£

GC Ö´ÐÐÍê±Ïºó£¬Ôٴε÷Óú¯Êý dvmHeapSourceAlloc ³¢ÊÔÇáÁ¿¼¶µÄÄÚ´æ·ÖÅä²Ù×÷¡£Èç¹û·ÖÅä³É¹¦£¬ÄÇô¾Í½«·ÖÅäµÃµ½µÄµØÖ·Ö±½Ó·µ»Ø¸øµ÷ÓÃÕßÁË¡£

Èç¹ûÉÏÒ»²½ÄÚ´æ·ÖÅäʧ°Ü£¬Õâʱºò¾ÍµÃ¿¼ÂÇÏȽ« Java ¶ÑµÄµ±Ç°´óСÉèÖÃΪ Dalvik ÐéÄâ»úÆô¶¯Ê±Ö¸¶¨µÄ Java ¶Ñ×î´óÖµ£¬ÔÙ½øÐÐÄÚ´æ·ÖÅäÁË¡£ÕâÊÇͨ¹ýµ÷Óú¯Êý dvmHeapSourceAllocAndGrow À´ÊµÏֵġ£

Èç¹ûµ÷Óú¯Êý dvmHeapSourceAllocAndGrow ·ÖÅäÄÚ´æ³É¹¦£¬ÔòÖ±½Ó½«·ÖÅäµÃµ½µÄµØÖ·Ö±½Ó·µ»Ø¸øµ÷ÓÃÕßÁË¡£

Èç¹ûÉÏÒ»²½ÄÚ´æ·ÖÅ仹ÊÇʧ°Ü£¬Õâʱºò¾ÍµÃ³öºÝÕÐÁË¡£Ôٴε÷Óú¯Êý gcForMalloc À´Ö´ÐÐ GC¡£²ÎÊý true ±íʾҪ»ØÊÕÈíÒýÓöÔÏóÒýÓõĶÔÏó¡£

GC Ö´ÐÐÍê±Ï£¬Ôٴε÷Óú¯Êý dvmHeapSourceAllocAndGrow ½øÐÐÄÚ´æ·ÖÅä¡£ÕâÊÇ×îºóÒ»´ÎŬÁ¦ÁË£¬³É¹¦Óëʶ¼µ½´ËΪֹ¡£

ʾÀýͼÈçÏ£º

ͨ¹ýÕâ¸öÁ÷³Ì¿ÉÒÔ¿´µ½£¬ÔÚ¶ÔÏóµÄ·ÖÅäÖлᵼÖ GC£¬µÚÒ»´Î·ÖÅä¶ÔÏóʧ°ÜÎÒÃǻᴥ·¢ GC µ«ÊDz»»ØÊÕ Soft µÄÒýÓã¬Èç¹ûÔٴηÖÅ仹ÊÇʧ°ÜÎÒÃǾͻὫ Soft µÄÄÚ´æÒ²¸ø»ØÊÕ£¬Ç°Õß´¥·¢µÄ GC ÊÇ GC_FOR_MALLOC ÀàÐ굀 GC£¬ºóÕßÊÇ GC_BEFORE_OOM ÀàÐ굀 GC¡£¶øµ±ÄÚ´æ·ÖÅä³É¹¦ºó£¬ÎÒÃÇ»áÅжϵ±Ç°µÄÄÚ´æÕ¼ÓÃÊÇ·ñÊÇ´ïµ½ÁË GC_CONCURRENT µÄ·§Öµ£¬Èç¹û´ïµ½ÁËÄÇôÓֻᴥ·¢ GC_CONCURRENT¡£

ÄÇôÕâ¸ö·§ÖµÓÖÊÇÈçºÎÀ´µÄÄØ£¬ÉÏÃæÎÒÃÇ˵µ½µÄÒ»¸öÄ¿±êÀûÓÃÂÊ£¬GC ºóÎÒÃÇ»á¼Ç¼һ¸öÄ¿±êÖµ£¬Õâ¸öÖµÀíÂÛÉÏÐèÒªÔÙÉÏÊöµÄ·¶Î§Ö®ÄÚ£¬Èç¹û²»ÔÚÎÒÃÇ»áѡȡ±ß½çÖµ×öΪĿ±êÖµ¡£ÐéÄâ»ú»á¼Ç¼Õâ¸öÄ¿±êÖµ£¬µ±×öµ±Ç°ÔÊÐí×ܵĿÉÒÔ·ÖÅäµ½µÄÄڴ档ͬʱ¸ù¾ÝÄ¿±êÖµ¼õÈ¥¹Ì¶¨Öµ£¨200~500K),µ±×ö´¥·¢ GC_CONCURRENT ʼþµÄãÐÖµ¡£

2.5 »ØÊÕËã·¨ºÍÄÚ´æË鯬

Ö÷Á÷µÄ´ó²¿·Ö Davik ²ÉÈ¡µÄ¶¼ÊDZê×¢ÓëÇåÀí£¨Mark and Sweep£©»ØÊÕËã·¨£¬Ò²ÓÐʵÏÖÁË¿½±´ GC µÄ£¬ÕâÒ»µãºÍ HotSpot ÊDz»Ò»ÑùµÄ£¬¾ßÌåʹÓÃʲôËã·¨ÊÇÔÚ±àÒëÆÚ¾ö¶¨µÄ£¬ÎÞ·¨ÔÚÔËÐеÄʱºò¶¯Ì¬¸ü»»¡£Èç¹ûÔÚ±àÒë dalvik ÐéÄâ»úµÄÃüÁîÖÐÖ¸Ã÷ÁË¡±WITH_COPYING_GC¡±Ñ¡ÏÔò±àÒ롱/dalvik/vm/alloc/Copying.cpp¡±Ô´Âë ¨C ´ËÊÇ Android Öп½±´ GC Ëã·¨µÄʵÏÖ£¬·ñÔò±àÒ롱/dalvik/vm/alloc/HeapSource.cpp¡± ¨C ÆäʵÏÖÁ˱ê×¢ÓëÇåÀí GC Ëã·¨¡£

ÓÉÓÚ Mark and Sweep Ëã·¨µÄȱµã£¬ÈÝÒ×µ¼ÖÂÄÚ´æË鯬£¬ËùÒÔÔÚÕâ¸öË㷨ϣ¬µ±ÎÒÃÇÓдóÁ¿²»Á¬ÐøÐ¡ÄÚ´æµÄʱºò£¬ÔÙ·ÖÅäÒ»¸ö½Ï´ó¶ÔÏóʱ£¬»¹ÊÇ»á·Ç³£ÈÝÒ×µ¼Ö GC£¬±ÈÈçÎÒÃÇÔÚ¸ÃÊÖ»úÉÏ decode ͼƬ£¬¾ßÌåÇé¿öÈçÏ£º

ËùÒÔ¶ÔÓÚ Dalvik ÐéÄâ»úµÄÊÖ»úÀ´Ëµ£¬ÎÒÃÇÊ×ÏÈÒª¾¡Á¿±ÜÃâµôƵ·±Éú³ÉºÜ¶àÁÙʱС±äÁ¿£¨±ÈÈç˵£ºgetView£¬onDraw µÈº¯Êý£©£¬ÁíÒ»¸öÓÖÒª¾¡Á¿È¥±ÜÃâ²úÉúºÜ¶à³¤ÉúÃüÖÜÆÚµÄ´ó¶ÔÏó¡£

3¡¢ART ÄÚ´æ»ØÊÕ»úÖÆ

3.1 Java ¶Ñ

ART ÔËÐÐʱÄÚ²¿Ê¹ÓÃµÄ Java ¶ÑµÄÖ÷Òª×é³É°üÀ¨ Image Space¡¢Zygote Space¡¢Allocation Space ºÍ Large Object Space Ëĸö Space£¬Image Space ÓÃÀ´´æÔÚһЩԤ¼ÓÔØµÄÀ࣬ Zygote Space ºÍ Allocation Space Óë Dalvik ÐéÄâ»úÀ¬»øÊÕ¼¯»úÖÆÖÐµÄ Zygote ¶ÑºÍ Active ¶ÑµÄ×÷ÓÃÊÇÒ»ÑùµÄ£¬

Large Object Space ¾ÍÊÇһЩÀëÉ¢µØÖ·µÄ¼¯ºÏ£¬ÓÃÀ´·ÖÅäһЩ´ó¶ÔÏó´Ó¶øÌá¸ßÁË GC µÄ¹ÜÀíЧÂʺÍÕûÌåÐÔÄÜ£¬ÀàËÆÈçÏÂͼ£º

ÔÚÏÂÎÄµÄ GC Log ÖУ¬ÎÒÃÇÒ²ÄÜ¿´µ½ÔÚ art µÄ GC Log Öаüº¬ÁË LOS µÄÐÅÏ¢£¬·½±ãÎÒÃDz鿴´óÄÚ´æµÄÇé¿ö¡£

3.2 GC µÄÀàÐÍ

kGcCauseForAlloc £¬µ±Òª·ÖÅäÄÚ´æµÄʱºò·¢ÏÖÄÚ´æ²»¹»µÄÇé¿öÏÂÒýÆðµÄ GC£¬ÕâÖÖÇé¿öÏ嵀 GC »á stop world

kGcCauseBackground£¬µ±ÄÚ´æ´ïµ½Ò»¶¨µÄ·§ÖµµÄʱºò»áÈ¥³ö·¢ GC£¬Õâ¸öʱºòÊÇÒ»¸öºǫ́ gc£¬²»»áÒýÆð stop world

kGcCauseExplicit£¬ÏÔʾµ÷ÓõÄʱºò½øÐÐµÄ gc£¬Èç¹û art ´ò¿ªÁËÕâ¸öÑ¡ÏîµÄÇé¿öÏ£¬ÔÚ system.gc µÄʱºò»á½øÐÐ gc

ÆäËû¸ü¶à

3.3 ¶ÔÏóµÄ·ÖÅäºÍ GC ´¥·¢Ê±»ú

ÓÉÓÚ Art ÏÂÄÚ´æ·ÖÅäºÍ Dalvik Ï»ù±¾Ã»ÓÐÈκÎÇø±ð£¬ÎÒÖ±½ÓÌùͼ´ø¹ýÁË¡£

3.4 ²¢·¢ºÍ·Ç²¢·¢ GC

Art ÔÚ GC Éϲ»Ïñ Dalvik ½öÓÐÒ»ÖÖ»ØÊÕËã·¨£¬Art ÔÚ²»Í¬µÄÇé¿öÏ»áÑ¡Ôñ²»Í¬µÄ»ØÊÕËã·¨£¬±ÈÈç Alloc ÄÚ´æ²»¹»µÄʱºò»á²ÉÓ÷Dz¢·¢ GC£¬¶øÔÚ Alloc ºó·¢ÏÖÄÚ´æ´ïµ½Ò»¶¨·§ÖµµÄʱºòÓֻᴥ·¢²¢·¢ GC¡£Í¬Ê±ÔÚǰºǫ́µÄÇé¿öÏ GC ²ßÂÔÒ²²»¾¡Ïàͬ£¬ºóÃæÎÒÃÇ»áÒ»Ò»¸ø´ó¼Ò˵Ã÷¡£

·Ç²¢·¢ GC

²½Öè 1. µ÷ÓÃ×ÓÀàʵÏֵijÉÔ±º¯Êý InitializePhase Ö´ÐÐ GC ³õʼ»¯½×¶Î¡£

²½Öè 2. ¹ÒÆðËùÓÐµÄ ART ÔËÐÐʱÏ̡߳£

²½Öè 3. µ÷ÓÃ×ÓÀàʵÏֵijÉÔ±º¯Êý MarkingPhase Ö´ÐÐ GC ±ê¼Ç½×¶Î¡£

²½Öè 4. µ÷ÓÃ×ÓÀàʵÏֵijÉÔ±º¯Êý ReclaimPhase Ö´ÐÐ GC »ØÊս׶Ρ£

²½Öè 5. »Ö¸´µÚ 2 ²½¹ÒÆðµÄ ART ÔËÐÐʱÏ̡߳£

²½Öè 6. µ÷ÓÃ×ÓÀàʵÏֵijÉÔ±º¯Êý FinishPhase Ö´ÐÐ GC ½áÊø½×¶Î¡£

²¢·¢ GC

²½Öè 1. µ÷ÓÃ×ÓÀàʵÏֵijÉÔ±º¯Êý InitializePhase Ö´ÐÐ GC ³õʼ»¯½×¶Î¡£

²½Öè 2. »ñÈ¡ÓÃÓÚ·ÃÎÊ Java ¶ÑµÄËø¡£

²½Öè 3. µ÷ÓÃ×ÓÀàʵÏֵijÉÔ±º¯Êý MarkingPhase Ö´ÐÐ GC ²¢Ðбê¼Ç½×¶Î¡£

²½Öè 4. ÊÍ·ÅÓÃÓÚ·ÃÎÊ Java ¶ÑµÄËø¡£

²½Öè 5. ¹ÒÆðËùÓÐµÄ ART ÔËÐÐʱÏ̡߳£

²½Öè 6. µ÷ÓÃ×ÓÀàʵÏֵijÉÔ±º¯Êý HandleDirtyObjectsPhase ´¦ÀíÔÚ GC ²¢Ðбê¼Ç½×¶Î±»Ð޸ĵĶÔÏ󡣡£

²½Öè 7. »Ö¸´µÚ 4 ²½¹ÒÆðµÄ ART ÔËÐÐʱÏ̡߳£

²½Öè 8. ÖØ¸´µÚ 5 µ½µÚ 7 ²½£¬Ö±µ½ËùÓÐÔÚ GC ²¢Ðн׶α»Ð޸ĵĶÔÏó¶¼´¦ÀíÍê³É¡£

²½Öè 9. »ñÈ¡ÓÃÓÚ·ÃÎÊ Java ¶ÑµÄËø¡£

²½Öè 10. µ÷ÓÃ×ÓÀàʵÏֵijÉÔ±º¯Êý ReclaimPhase Ö´ÐÐ GC »ØÊս׶Ρ£

²½Öè 11. ÊÍ·ÅÓÃÓÚ·ÃÎÊ Java ¶ÑµÄËø¡£

²½Öè 12. µ÷ÓÃ×ÓÀàʵÏֵijÉÔ±º¯Êý FinishPhase Ö´ÐÐ GC ½áÊø½×¶Î¡£

ËùÒÔ²»ÂÛÊDz¢·¢»¹ÊǷDz¢·¢£¬¶¼»áÒýÆð stopworld µÄÇé¿ö³öÏÖ£¬²¢·¢µÄÇé¿öϵ¥´Î stopworld µÄʱ¼ä»á¸ü¶Ì£¬»ù±¾Çø±ðºÍ¡£

3.5 Art ²¢·¢ºÍ Dalvik ²¢·¢ GC µÄ²îÒì

Ê×ÏÈ¿ÉÒÔͨ¹ýÈçÏ 2 ÕÅͼÀ´¶Ô±ÈÏÂ

Dalvik GC£º

Art GC£º

Art µÄ²¢·¢ GC ºÍ Dalvik µÄ²¢·¢ GC ÓÐÊ²Ã´Çø±ðÄØ£¬³õ¿´ºÃÏñ 2 Õ߲¶à£¬ËäȻûÓÐÒ»Ö±¹ÒÆðỊ̈߳¬µ«ÊÇÒ²»áÓÐÔÝÍ£Ïß³ÌÈ¥Ö´Ðбê¼Ç¶ÔÏóµÄÁ÷³Ì¡£Í¨¹ýÔĶÁÏà¹ØÎĵµ¿ÉÒÔÁ˽⵽ Art ²¢·¢ GC ¶ÔÓÚ Dalvik À´ËµÖ÷ÒªÓÐÈý¸öÓÅÊÆµã£º

1¡¢±ê¼Ç×ÔÉí

Art ÔÚ¶ÔÏó·ÖÅäʱ»á½«Ð·ÖÅäµÄ¶ÔÏóѹÈëµ½ Heap ÀàµÄ³ÉÔ±±äÁ¿ allocation_stack_ ÃèÊöµÄ Allocation Stack ÖÐÈ¥£¬´Ó¶ø¿ÉÒÔÒ»¶¨³Ì¶ÈËõ¼õ¶ÔÏó±éÀú·¶Î§¡£

2¡¢Ô¤¶ÁÈ¡

¶ÔÓÚ±ê¼Ç Allocation Stack µÄÄÚ´æÊ±£¬»áÔ¤¶ÁÈ¡½ÓÏÂÀ´Òª±éÀúµÄ¶ÔÏó£¬Í¬Ê±ÔÙÈ¡³öÀ´¸Ã¶ÔÏóºóÓֻὫ¸Ã¶ÔÏóÒýÓÃµÄÆäËû¶ÔÏóѹÈëÕ»ÖУ¬Ö±ÖÁ±éÀúÍê±Ï¡£

3¡¢¼õÉÙ Pause ʱ¼ä

ÔÚ Mark ½×¶ÎÊDz»»á Block ÆäËûÏ̵߳ģ¬Õâ¸ö½×¶Î»áÓÐÔàÊý¾Ý£¬±ÈÈç Mark ·¢ÏÖ²»»áʹÓõĵ«ÊÇÕâ¸öʱºòÓÖ±»ÆäËûÏß³ÌʹÓõÄÊý¾Ý£¬ÔÚ Mark ½×¶ÎÒ²»á´¦ÀíһЩÔàÊý¾Ý¶ø²»ÊÇÁôÔÚ×îºó Block µÄʱºòÔÙÈ¥´¦Àí£¬ÕâÑùÒ²»á¼õÉÙºóÃæ Block ½×¶Î¶ÔÓÚÔàÊý¾ÝµÄ´¦ÀíµÄʱ¼ä¡£

3.6 ǰºǫ́ GC

ǰ̨ Foreground Ö¸µÄ¾ÍÊÇÓ¦ÓóÌÐòÔÚǰ̨ÔËÐÐʱ£¬¶øºǫ́ Background ¾ÍÊÇÓ¦ÓóÌÐòÔÚºǫ́ÔËÐÐʱ¡£Òò´Ë£¬Foreground GC ¾ÍÊÇÓ¦ÓóÌÐòÔÚǰ̨ÔËÐÐʱִÐÐµÄ GC£¬¶ø Background ¾ÍÊÇÓ¦ÓóÌÐòÔÚºǫ́ÔËÐÐʱִÐÐµÄ GC¡£

Ó¦ÓóÌÐòÔÚǰ̨ÔËÐÐʱ£¬ÏìÓ¦ÐÔÊÇ×îÖØÒªµÄ£¬Òò´ËÒ²ÒªÇóÖ´ÐÐµÄ GC ÊǸßЧµÄ¡£Ïà·´£¬Ó¦ÓóÌÐòÔÚºǫ́ÔËÐÐʱ£¬ÏìÓ¦ÐÔ²»ÊÇ×îÖØÒªµÄ£¬Õâʱºò¾ÍÊʺÏÓÃÀ´½â¾ö¶ÑµÄÄÚ´æË鯬ÎÊÌâ¡£Òò´Ë£¬Mark-Sweep GC ÊʺÏ×÷Ϊ Foreground GC£¬¶ø Mark-Compact GC ÊʺÏ×÷Ϊ Background GC¡£

ÓÉÓÚÓÐ Compact µÄÄÜÁ¦´æÔÚ£¬Ë鯬»¯ÔÚ Art ÉÏ¿ÉÒԺܺõı»±ÜÃ⣬Õâ¸öÒ²ÊÇ Art Ò»¸öºÜºÃµÄÄÜÁ¦¡£

3.7 Art ´ó·¨ºÃ

×ܵÄÀ´¿´£¬art ÔÚ gc ÉÏ×öµÄ±È dalvik ºÃÌ«¶àÁË£¬²»¹âÊÇ gc µÄЧÂÊ£¬¼õÉÙ pause ʱ¼ä£¬¶øÇÒ»¹ÔÚÄÚ´æ·ÖÅäÉ϶ԴóÄÚ´æµÄÓе¥¶ÀµÄ·ÖÅäÇøÓò£¬Í¬Ê±»¹ÄÜÓÐËã·¨ÔÚºǫ́×öÄÚ´æÕûÀí£¬¼õÉÙÄÚ´æË鯬¡£¶ÔÓÚ¿ª·¢ÕßÀ´Ëµ art ÏÂÎÒÃÇ»ù±¾¿ÉÒÔ±ÜÃâºÜ¶àÀàËÆ gc µ¼ÖµĿ¨¶ÙÎÊÌâÁË¡£ÁíÍâ¸ù¾Ý¹È¸è×Ô¼ºµÄÊý¾ÝÀ´¿´£¬Art Ïà¶Ô Dalvik ÄÚ´æ·ÖÅäµÄЧÂÊÌá¸ßÁË 10 ±¶£¬GC µÄЧÂÊÌá¸ßÁË 2-3 ±¶¡£

4¡¢GC Log

µ±ÎÒÃÇÏëÒª¸ù¾Ý GC ÈÕÖ¾À´×·²éһЩ GC ¿ÉÄÜÔì³ÉµÄ¿¨¶Ùʱ£¬ÎÒÃÇÐèÒªÁ˽â GC ÈÕÖ¾µÄ×é³É£¬²»Í¬ÐÅÏ¢´ú±íÁËʲôº¬Òå¡£

4.1 Dalvik GC ÈÕÖ¾

dalvik µÄÈÕÖ¾¸ñʽ»ù±¾ÈçÏ£º

D/dalvikvm:
<GC_Reason> <Amount_freed>, <Heap_stats>, <Pause_time>, <Total_time>

gc_reason£º¾ÍÊÇÎÒÃÇÉÏÎÄÌáµ½µÄ£¬ÊÇ gc_alloc »¹ÊÇ gc_concurrent£¬Á˽⵽²»Í¬µÄÔ­Òò·½±ãÎÒÃÇ×ö²»Í¬µÄ´¦Àí¡£

amount_freed£º±íʾϵͳͨ¹ýÕâ´Î GC ²Ù×÷ÊÍ·ÅÁ˶àÉÙÄÚ´æ

Heap_stats£ºÖлáÏÔʾµ±Ç°ÄÚ´æµÄ¿ÕÏбÈÀýÒÔ¼°Ê¹ÓÃÇé¿ö£¨»î¶¯¶ÔÏóËùÕ¼ÄÚ´æ / µ±Ç°³ÌÐò×ÜÄڴ棩

Pause_time£º±íʾÕâ´Î GC ²Ù×÷µ¼ÖÂÓ¦ÓóÌÐòÔÝÍ£µÄʱ¼ä¡£¹ØÓÚÕâ¸öÔÝÍ£µÄʱ¼ä£¬ÔÚ 2.3 ֮ǰ GC ²Ù×÷ÊDz»Äܲ¢·¢½øÐеģ¬Ò²¾ÍÊÇϵͳÕýÔÚ½øÐÐ GC£¬ÄÇôӦÓóÌÐò¾ÍÖ»ÄÜ×èÈûסµÈ´ý GC ½áÊø¡£¶ø×Ô 2.3 Ö®ºó£¬GC ²Ù×÷¸Ä³ÉÁ˲¢·¢µÄ·½Ê½½øÐУ¬¾ÍÊÇ˵ GC µÄ¹ý³ÌÖв»»áÓ°Ïìµ½Ó¦ÓóÌÐòµÄÕý³£ÔËÐУ¬µ«ÊÇÔÚ GC ²Ù×÷µÄ¿ªÊ¼ºÍ½áÊøµÄʱºò»á¶ÌÔÝ×èÈûÒ»¶Îʱ¼ä£¬ËùÒÔ»¹ÓкóÐøµÄÒ»¸ö total_time¡£

Total_time:±íʾ±¾´Î GC Ëù»¨·ÑµÄ×Üʱ¼äºÍÉÏÃæµÄ Pause_time,Ò²¾ÍÊÇ stop all ÊDz»Ò»ÑùµÄ£¬¿¨¶Ùʱ¼äÖ÷Òª¿´ÉÏÃæµÄ pause_time¡£

4.2 Art GC ÈÕÖ¾

I/art:
<GC_Reason> <Amount_freed>, <LOS_Space_Status>, <Heap_stats>, <Pause_time>, <Total_time>

»ù±¾Çé¿öºÍ Dalvik ûÓÐʲô²î±ð£¬GC µÄ Reason ¸ü¶àÁË£¬»¹¶àÁËÒ»¸ö OS_Space_Status

LOS_Space_Status£ºLarge Object Space£¬´ó¶ÔÏóÕ¼ÓõĿռ䣬Õⲿ·ÖÄÚ´æ²¢²»ÊÇ·ÖÅäÔÚ¶ÑÉϵ쬵«ÈÔÊôÓÚÓ¦ÓóÌÐòÄÚ´æ¿Õ¼ä£¬Ö÷ÒªÓÃÀ´¹ÜÀí bitmap µÈÕ¼ÄÚ´æ´óµÄ¶ÔÏ󣬱ÜÃâÒò·ÖÅä´óÄÚ´æµ¼ÖÂ¶ÑÆµ·± GC¡£

   
1457 ´Îä¯ÀÀ       27
 
Ïà¹ØÎÄÕÂ

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

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

Android¸ß¼¶Òƶ¯Ó¦ÓóÌÐò
Androidϵͳ¿ª·¢
AndroidÓ¦Óÿª·¢
ÊÖ»úÈí¼þ²âÊÔ