µ¼Óï
Ïëдһƪ¹ØÓÚ 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¡£ |