1.
ʲôÊÇDalvikÐéÄâ»ú
DalvikÊÇGoogle¹«Ë¾×Ô¼ºÉè¼ÆÓÃÓÚAndroidƽ̨µÄJavaÐéÄâ»ú£¬ËüÊÇAndroidƽ̨µÄÖØÒª×é³É²¿·Ö£¬Ö§³Ödex¸ñʽ(Dalvik
Executable)µÄJavaÓ¦ÓóÌÐòµÄÔËÐС£dex¸ñʽÊÇרÃÅΪDalvikÉè¼ÆµÄÒ»ÖÖѹËõ¸ñʽ£¬ÊʺÏÄÚ´æºÍ´¦ÀíÆ÷ËÙ¶ÈÓÐÏÞµÄϵͳ¡£Google¶ÔÆä½øÐÐÁËÌØ¶¨µÄÓÅ»¯£¬Ê¹µÃDalvik¾ßÓиßЧ¡¢¼ò½à¡¢½ÚÊ¡×ÊÔ´µÄÌØµã¡£´ÓAndroidϵͳ¼Ü¹¹Í¼Öª£¬DalvikÐéÄâ»úÔËÐÐÔÚAndroidµÄÔËÐÐʱ¿â²ã¡£
2. DalvikÐéÄâ»úµÄ¹¦ÄÜ
Dalvik×÷ÎªÃæÏòLinux¡¢ÎªÇ¶Èëʽ²Ù×÷ϵͳÉè¼ÆµÄÐéÄâ»ú£¬Ö÷Òª¸ºÔðÍê³É¶ÔÏóÉúÃüÖÜÆÚ¹ÜÀí¡¢¶ÑÕ»¹ÜÀí¡¢Ï̹߳ÜÀí¡¢°²È«ºÍÒì³£¹ÜÀí£¬ÒÔ¼°À¬»ø»ØÊյȡ£Dalvik³ä·ÖÀûÓÃLinux½ø³Ì¹ÜÀíµÄÌØ¶¨£¬¶ÔÆä½øÐÐÁËÃæÏò¶ÔÏóµÄÉè¼Æ£¬Ê¹µÃ¿ÉÒÔͬʱÔËÐжà¸ö½ø³Ì£¬¶ø´«Í³µÄJava³ÌÐòͨ³£Ö»ÄÜÔËÐÐÒ»¸ö½ø³Ì£¬ÕâÒ²ÊÇΪʲôAndroid²»²ÉÓÃJVMµÄÔÒò¡£DalvikΪÁË´ïµ½ÓÅ»¯µÄÄ¿µÄ£¬µ×²ãµÄ²Ù×÷´ó¶àºÍϵͳÄÚºËÏà¹Ø£¬»òÕßÖ±½Óµ÷ÓÃÄں˽ӿڡ£ÁíÍ⣬DalvikÔçÆÚ²¢Ã»ÓÐJIT±àÒëÆ÷£¬Ö±µ½Android2.2²Å¼ÓÈëÁ˶ÔJITµÄ¼¼ÊõÖ§³Ö¡£
3. DalvikÐéÄâ»úºÍJavaÐéÄâ»úµÄÇø±ð
±¾ÖÊÉÏ£¬DalvikÒ²ÊÇÒ»¸öJavaÐéÄâ»ú¡£µ«ËüÌØ±ðÖ®´¦ÔÚÓÚûÓÐʹÓÃJVM¹æ·¶¡£´ó¶àÊýJavaÐéÄâ»ú¶¼ÊÇ»ùÓÚÕ»µÄ½á¹¹(ÏêÇéÇë²Î¿¼£ºÀí½âJavaÐéÄâ»úÌåϵ½á¹¹)£¬¶øDalvikÐéÄâ»úÔòÊÇ»ùÓڼĴæÆ÷¡£»ùÓÚÕ»µÄÖ¸ÁîºÜ½ô´Õ£¬ÀýÈ磬JavaÐéÄâ»úʹÓõÄÖ¸ÁîÖ»Õ¼Ò»¸ö×Ö½Ú£¬Òò¶ø³ÆÎª×Ö½ÚÂë¡£»ùÓڼĴæÆ÷µÄÖ¸ÁîÓÉÓÚÐèÒªÖ¸¶¨Ô´µØÖ·ºÍÄ¿±êµØÖ·£¬Òò´ËÐèÒªÕ¼Óøü¶àµÄÖ¸Áî¿Õ¼ä¡£DalvikÐéÄâ»úµÄijЩָÁîÐèÒªÕ¼ÓÃÁ½¸ö×Ö½Ú¡£»ùÓÚÕ»ºÍ»ùÓڼĴæÆ÷µÄÖ¸Á¸÷ÓÐÓÅÁÓ£¬Ò»°ã¶øÑÔ£¬Ö´ÐÐͬÑùµÄ¹¦ÄÜ£¬Ç°ÕßÐèÒª¸ü¶àµÄÖ¸Áî(Ö÷ÒªÊÇloadºÍstoreÖ¸Áî)£¬¶øºóÕßÐèÒª¸ü¶àµÄÖ¸Áî¿Õ¼ä¡£ÐèÒª¸ü¶àÖ¸ÁîÒâζ×ÅÒª¶àÕ¼ÓÃCPUʱ¼ä£¬¶øÐèÒª¸ü¶àÖ¸Áî¿Õ¼äÒâζ×ÅÊý¾Ý»º³å(d-cache)¸üÒ×ʧЧ¡£¸ü¶àÌÖÂÛ£¬ÐéÄâ»úËæÌ¸(Ò»)£º½âÊÍÆ÷£¬Ê÷±éÀú½âÊÍÆ÷£¬»ùÓÚÕ»Óë»ùÓڼĴæÆ÷£¬´óÔÓ»â
¸ø³öÁ˷dz£ÏêϸµÄ²Î¿¼¡£
JavaÐéÄâ»úÔËÐеÄÊÇJava×Ö½ÚÂ룬¶øDalvikÐéÄâ»úÔËÐеÄÊÇרÓÐÎļþ¸ñʽdex¡£ÔÚJava³ÌÐòÖУ¬JavaÀà»á±»±àÒë³ÉÒ»¸ö»ò¶à¸öclassÎļþ£¬È»ºó´ò°üµ½jarÎļþÖУ¬½Ó×ÅJavaÐéÄâ»ú»á´ÓÏàÓ¦µÄclassÎļþºÍjarÎļþÖлñÈ¡¶ÔÓ¦µÄ×Ö½ÚÂë¡£AndroidÓ¦ÓÃËäȻҲʹÓÃJavaÓïÑÔ£¬µ«ÊÇÔÚ±àÒë³ÉclassÎļþºó£¬»¹»áͨ¹ýDEX¹¤¾ß½«ËùÓеÄclassÎļþת»»³ÉÒ»¸ödexÎļþ£¬DalvikÐéÄâ»úÔÙ´ÓÖжÁȡָÁîºÍÊý¾Ý¡£dexÎļþ³ýÁ˼õÉÙÕûÌåµÄÎļþ³ß´çºÍI/O²Ù×÷´ÎÊý£¬Ò²Ìá¸ßÁËÀàµÄ²éÕÒËÙ¶È¡£

ÓÉÏÂͼ¿ÉÒÔ¿´µ½£¬jarºÍapkÎļþµÄ×é³É½á¹¹£¬ÒÔ¼°classÎļþºÍdexÎļþµÄ²îÒì¡£dex¸ñʽÎļþʹÓù²ÏíµÄ¡¢Ìض¨ÀàÐ͵ij£Á¿³Ø»úÖÆÀ´½ÚÊ¡ÄÚ´æ¡£³£Á¿³Ø´æ´¢ÀàÖеÄËùÓÐ×ÖÃæ³£Á¿£¬Ëü°üÀ¨×Ö·û´®³£Á¿¡¢×ֶγ£Á¿µÈÖµ¡£

×ܵÄÀ´Ëµ£¬DalvikÐéÄâ»ú¾ßÓÐÒÔÏÂÌØµã£º
ʹÓÃdex¸ñʽµÄ×Ö½ÚÂ룬²»¼æÈÝJava×Ö½ÚÂë¸ñʽ
´úÂëÃܶÈС£¬ÔËÐÐЧÂʸߣ¬½ÚÊ¡×ÊÔ´
³£Á¿³ØÖ»Ê¹ÓÃ32λµÄË÷Òý
ÓÐÄÚ´æÏÞÖÆ
ĬÈÏÕ»´óСÊÇ12KB(3¸öÒ³£¬Ã¿Ò³4KB)
¶ÑĬÈÏÆô¶¯´óСΪ2MB£¬Ä¬ÈÏ×î´óֵΪ16MB
¶ÑÖ§³ÖµÄ×îСÆô¶¯´óСΪ1MB£¬Ö§³ÖµÄ×î´óֵΪ1024MB
¶ÑºÍÕ»²ÎÊý¿ÉÒÔͨ¹ý-XmsºÍ-XmxÐÞ¸Ä
4. Dalvikϵͳ½á¹¹
ʵ¼ÊÉÏ£¬DalvikÊÇ»ùÓÚApache Harmony(ApacheÈí¼þ»ù½ð»áµÄJava
SEÏîÄ¿)µÄ²¿·ÖʵÏÖ£¬ÌṩÁË×Ô¼ºµÄÒ»Ì׿⣬¼´ÉϲãJavaÓ¦ÓóÌÐò±àдËùʹÓõÄAPI¡£

ÒÔÉÏͼʾÀ´×Ôtech-insider¡£Apache Harmony´óÌåÉÏ·ÖΪÈý¸ö²ã£º²Ù×÷ϵͳ¡¢JavaÐéÄâ»ú¡¢JavaÀà¿â¡£ËüµÄÌØµãÔÚÓÚÐéÄâ»úºÍÀà¿âÄÚ²¿±»¸ß¶ÈÄ£¿é»¯£¬Ã¿Ò»¸öÄ£¿é¶¼ÓÐÒ»¶¨µÄ½Ó¿Ú¶¨Òå¡£²Ù×÷ϵͳ²ãÓëÐéÄâ»ú²ãÖ®¼äµÄ½Ó¿ÚÓÉPortability
Layer¶¨Ò壬Ëü·â×°Á˲»Í¬²Ù×÷ϵͳµÄ²îÒ죬ΪÐéÄâ»úºÍÀà¿âµÄ±¾µØ´úÂëÌṩÁËÒ»Ì×ͳһµÄAPI·ÃÎʵײãϵͳµ÷Óá£ÐéÄâ»úÓëÀà¿âÖ®¼äµÄ½Ó¿Ú³ýÁËJava¹æ·¶¶¨ÒåµÄJNI¡¢JVMITIÍ⣬»¹¼ÓÈëÁËÒ»²ãÐéÄâ»ú½Ó¿Ú£¬ÓÉÄÚºËÀàºÍ±¾µØ´úÂë×é³É¡£ÊµÏÖÁËÐéÄâ»ú½Ó¿ÚµÄÐéÄâ»ú¶¼¿ÉÒÔʹÓÃHarmonyµÄÀà¿âʵÏÖ£¬²¢ÇÒ¿ÉÒÔ±»HarmonyÌṩµÄͬһ¸öJavaÆô¶¯³ÌÐòÆô¶¯¡£
ÏÂÃæÊÇDalvikÐéÄâ»úµÄ½á¹¹Í¼£º

Ò»¸öÓ¦ÓÃÊ×ÏȾ¹ýDX¹¤¾ß½«classÎļþת»»³ÉDalvikÐéÄâ»ú¿ÉÒÔÖ´ÐеÄdexÎļþ£¬È»ºóÓÉÀà¼ÓÔØÆ÷¼ÓÔØÔÉúÀàºÍJavaÀ࣬½Ó×ÅÓɽâÊÍÆ÷¸ù¾ÝÖ¸Á¶ÔDalvik×Ö½ÚÂë½øÐнâÊÍ¡¢Ö´ÐС£×îºó£¬¸ù¾Ýdvm_arch²ÎÊýÑ¡Ôñ±àÒëµÄÄ¿±ê»úÌåϵ½á¹¹¡£
4.1 dexÎļþ½á¹¹
dexÎļþ½á¹¹ºÍclassÎļþ½á¹¹²îÒìµÄµØ·½ºÜ¶à£¬µ«´ÓЯ´øµÄÐÅÏ¢ÉÏ¿´£¬dexºÍclassÎļþÊÇÒ»Öµġ£

header£º´æ´¢Á˸÷¸öÊý¾ÝÀàÐÍµÄÆðʼµØÖ·¡¢Æ«ÒÆÁ¿µÈÐÅÏ¢¡£
proto_ids£ºÃèÊöº¯ÊýÔÐÍÐÅÏ¢£¬°üÀ¨·µ»ØÖµ£¬²ÎÊýÐÅÏ¢¡£±ÈÈç¡°test:()V¡±
methods_ids£ºº¯ÊýÐÅÏ¢£¬°üÀ¨ËùÊôÀ༰¶ÔÓ¦µÄprotoÐÅÏ¢¡£
¸ü¶àdex¸ñʽµÄÄÚÈÝ£¬Android°²È«¨CDexÎļþ¸ñʽÏê½â ÕâÆªÎÄÕ½øÐÐÁ˷dz£ÏêϸµÄ½éÉÜ¡£ËäÈ»dexÎļþµÄ½á¹¹ºÜ½ô´Õ£¬µ«ÏëÒªÔËÐÐʱµÄÐÔÄܵõ½½øÒ»²½ÌáÉý£¬»¹ÐèÒª¶ÔdexÎļþ½øÐнøÒ»²½ÓÅ»¯¡£ÓÅ»¯Ö÷ÒªÕë¶ÔÒÔϼ¸¸ö·½Ã棺
µ÷ÕûËùÓÐ×ֶεÄ×Ö½ÚÐòºÍ¶ÔÆë½á¹¹ÖеÄÿһ¸öÓò
ÑéÖ¤dexÎļþÖеÄËùÓÐÀà
¶ÔÒ»Ð©ÌØ¶¨µÄÀà½øÐÐÓÅ»¯£¬¶Ô·½·¨ÀïµÄ²Ù×÷Âë½øÐÐÓÅ»¯
dexÎļþ¾¹ýÓÅ»¯ºóÎļþ´óС»áÅòÕÍ£¬´óÔ¼Ôö¼Óµ½ÔÀ´µÄ1~4±¶¡£¶ÔÓÚÄÚÖÃÓ¦Óã¬Ò»°ãÔÚϵͳ±àÒëºó£¬±ã»áÉú³ÉÓÅ»¯Îļþ(odex:
Optimized dex)¡£Ò»¸öAndroidÓ¦ÓóÌÐò£¬ÐèÒª¾¹ýÒÔϹý³Ì²Å¿ÉÒÔÔÚDalvikÐéÄâ»úÉÏÔËÐУº
°ÑJavaÔ´Îļþ±àÒë³ÉclassÎļþ
ʹÓÃDX¹¤¾ß°ÑclassÎļþת»»³ÉdexÎļþ
ʹÓÃaapt¹¤¾ß°ÑdexÎļþ¡¢×ÊÔ´ÎļþÒÔ¼°AndroidManifest.xmlÎļþ(¶þ½øÖƸñʽ)×éºÏ³ÉAPK
½«APK°²×°µ½AndroidÉ豸ÔËÐÐ
ÉÏͼ(À´×ÔÍøÂç)Ï꾡µØÕ¹Ê¾ÁË×îÖÕÇ©ÃûºóµÄAPKÊÇÔõôÀ´µÄ¡£
4.2 DalvikÀà¼ÓÔØÆ÷
Ò»¸ödexÎļþÐèÒªÀà¼ÓÔØÆ÷¼ÓÔØÔÉúÀàºÍJavaÀ࣬Ȼºóͨ¹ý½âÊÍÆ÷¸ù¾ÝÖ¸Á¶ÔDalvik×Ö½ÚÂë½øÐнâÊͺÍÖ´ÐС£DalvikÀà¼ÓÔØÆ÷ʹÓÃmmapº¯Êý£¬½«dexÎļþÓ³Éäµ½ÄÚ´æÖУ¬Í¨¹ýÆÕͨµÄÄÚ´æ¶ÁÈ¡²Ù×÷¼´¿É·ÃÎÊdexÎļþ£¬È»ºó½âÎödexÎļþÄÚÈݲ¢¼ÓÔØÆäÖеÄÀൽ¹þÏ£±íÖС£
4.2.1 ½âÎödex
×ܵÄÀ´Ëµ£¬dexÎļþ¿ÉÒÔ³éÏóΪÈý¸ö²¿·Ö£ºÍ·²¿¡¢Ë÷Òý¡¢Êý¾Ý¡£Í¨¹ýÍ·²¿¿ÉÒÔÖªµÀË÷ÒýµÄλÖúÍÊýÄ¿£¬ÒÔ¼°Êý¾ÝÇøµÄÆðʼλÖ᣽«dexÎļþÓ³Éäµ½ÄÚ´æºó£¬Dalvik»áµ÷ÓÃdexFileParseº¯Êý¶ÔÆä½øÐзÖÎö£¬·ÖÎöµÄ½á¹û·Åµ½DexFileÊý¾Ý½á¹¹ÖС£DexFileÖеÄbaseAddrÖ¸ÏòÓ³ÉäÇøµÄÆðʼλÖã¬pClassDefsÖ¸ÏòclassË÷ÒýµÄÆðʼλÖá£ÎªÁ˼ӿìclassµÄ²éÕÒËÙ¶È£¬»¹´´½¨Ò»¸ö¹þÏ£±í£¬¶ÔclassÃû×Ö½øÐйþÏ£²¢Éú³ÉË÷Òý¡£
4.2.2 ¼ÓÔØclass
½âÎö¹¤×÷Íê³Éºó¾Í½øÐÐclassµÄ¼ÓÔØ£¬¼ÓÔØµÄÀàÐèÒªÓÃClassObjectÊý¾Ý½á¹¹À´´æ´¢¡£
typedef struct Object { ClassObject* clazz; // ÀàÐͶÔÏó Lock lock; // Ëø¶ÔÏó } Object; |
ÆäÖÐclazzÖ¸ÏòClassObject¶ÔÏ󣬻¹°üº¬Ò»¸öLock¶ÔÏó¡£Èç¹ûÆäËüÏß³ÌÏëÒª»ñÈ¡ËüµÄËø£¬Ö»ÓеÈÕâ¸öÏß³ÌÊÍ·Å¡£Dalvikÿ¼ÓÔØÒ»¸öclass¶¼»á¶ÔÓ¦Ò»¸öClassObject¶ÔÏ󣬼ÓÔØ¹ý³Ì»áÔÚÄÚ´æÖзÖÅ伸¸öÇøÓò£¬·Ö±ð´æ·ÅdirectMethod,
virtualMethod, sfield, ifield¡£ÕâЩÐÅÏ¢´ÓdexÎļþµÄÊý¾ÝÇøÖжÁÈ¡¡£×Ö¶ÎFieldµÄ¶¨ÒåÈçÏ£º
struct Field { ClassObject* clazz; //ËùÊôÀàÐÍ const char* name; // ±äÁ¿Ãû³Æ const char* signature; // Èç¡°Landroid/os/Debug;¡± u4 accessFlags; // ·ÃÎʱê¼Ç #ifdef PROFILE_FIELD_ACCESS u4 gets; u4 puts; #endif }; |
´ýµÃµ½classË÷Òýºó£¬Êµ¼ÊµÄ¼ÓÔØÓÉloadClassFromDexÀ´Íê³É¡£Ê×ÏÈËü»á¶ÁÈ¡classµÄ¾ßÌåÊý¾Ý£¬·Ö±ð¼ÓÔØdirectMethod,
virtualMethod, ifieldºÍsfield£¬È»ºóΪClassObjectÊý¾Ý½á¹¹·ÖÅäÄڴ棬²¢¶ÁÈ¡dexÎļþµÄÏà¹ØÐÅÏ¢¡£¼ÓÔØÍê³Éºó£¬½«¼ÓÔØµÄclassͨ¹ýdvmAddClassToHashº¯Êý·ÅÈë¹þÏ£±í£¬ÒÔ·½±ãÏ´βéÕÒ;×îºó£¬Í¨¹ýdvmLinkClass²éÕÒ¸ÃÀàµÄ³¬À࣬Èç¹ûÓнӿÚÀàÔò¼ÓÔØÏàÓ¦µÄ½Ó¿ÚÀà¡£
4.3 Dalvik½âÊÍÆ÷
¶ÔÓÚÈκÎÐéÄâ»úÀ´Ëµ£¬½âÊÍÆ÷ÎÞÒÉÊǺËÐĵIJ¿·Ö£¬ËùÓеÄJava×Ö½ÚÂë¶¼¾¹ý½âÊÍÆ÷½âÊÍÖ´ÐС£ÓÉÓÚDalvik½âÊÍÆ÷µÄЧÂʺÜÖØÒª£¬Android·Ö±ðʵÏÖÁËCÓïÑÔ°æºÍ¸÷ÖÖ»ã±àÓïÑÔ°æµÄ½âÊÍÆ÷¡£½âÊÍÆ÷ͨ³£ÊÇÑ»·Ö´ÐУ¬ÐèÒªÒ»¸öÈë¿Úº¯Êýµ÷Óô¦Àí³ÌÐòÖ´ÐеÚÒ»ÌõÖ¸Á¶øºóÿÌõÖ¸ÁîÖ´ÐÐʱÒý³öÏÂÒ»ÌõÖ¸Áͨ¹ýº¯ÊýÖ¸Õëµ÷Óô¦Àí³ÌÐò¡£
4.4 ÄÚ´æ¹ÜÀí
À¬»øÊÕ¼¯ÊÇDalvikÐéÄâ»úÄÚ´æ¹ÜÀíµÄºËÐÄ¡£´Ë´¦Ö»½éÉÜDalvikÐéÄâ»úµÄÀ¬»øÊÕ¼¯¹¦ÄÜ¡£À¬»øÊÕ¼¯µÄÐÔÄÜÔںܴó³Ì¶ÈÉÏÓ°ÏìÁËÒ»¸öJava³ÌÐòÄÚ´æÊ¹ÓõÄЧÂÊ¡£DalvikÐéÄâ»úʹÓó£ÓõÄMark-SweepËã·¨£¬¸ÃËã·¨·ÖMark½×¶Î(±ê¼Ç³ö»î¶¯¶ÔÏó)¡¢Sweep½×¶Î(»ØÊÕÀ¬»øÄÚ´æ)ºÍ¿ÉÑ¡µÄCompact½×¶Î(¼õÉÙ¶ÑÖеÄË鯬)¡£AndroidÄÚ´æ¹ÜÀíÔÀí
ÕâÆªÎÄÕ½²½âµÃºÜÏêϸ¡£
À¬»øÊÕ¼¯µÄµÚÒ»²½ÊDZê¼Ç³ö»î¶¯¶ÔÏó£¬ÒòΪûÓа취ʶ±ðÄÇЩ²»¿É·ÃÎʵĶÔÏó£¬ÕâÑùËùÓÐδ±»±ê¼ÇµÄ¶ÔÏó¾ÍÊÇ¿ÉÒÔ»ØÊÕµÄÀ¬»ø¡£µ±½øÐÐÀ¬»øÊÕ¼¯Ê±£¬ÐèҪֹͣDalvikÐéÄâ»úµÄÔËÐÐ(³ýÀ¬»øÊÕ¼¯Íâ)£¬Òò´ËÀ¬»øÊÕ¼¯ÓÖ±»³Æ×÷STW(stop-the-world)¡£DalvikÐéÄâ»úÔÚÔËÐйý³ÌÖÐҪά»¤Ò»Ð©×´Ì¬ÐÅÏ¢£¬ÕâЩÐÅÏ¢°üÀ¨£ºÃ¿¸öÏß³ÌËù±£´æµÄ¼Ä´æÆ÷¡¢JavaÀàÖеľ²Ì¬×ֶΡ¢¾Ö²¿ºÍÈ«¾ÖµÄJNIÒýÓã¬JVMÖеÄËùÓк¯Êýµ÷Óûá¶ÔÓ¦Ò»¸öÏàÓ¦CµÄÕ»Ö¡¡£Ã¿Ò»¸öÕ»Ö¡Àï¿ÉÄܰüº¬¶Ô¶ÔÏóµÄÒýÓ㬱ÈÈç°üº¬¶ÔÏóÒýÓõľֲ¿±äÁ¿ºÍ²ÎÊý¡£ËùÓÐÕâЩÒýÓÃÐÅÏ¢±»¼ÓÈëµ½Ò»¸ö¸ù¼¯ºÏÖУ¬È»ºó´Ó¸ù¼¯ºÏ¿ªÊ¼£¬µÝ¹é²éÕÒ¿ÉÒÔ´Ó¸ù¼¯ºÏ³ö·¢·ÃÎʵĶÔÏó¡£Òò´Ë£¬Mark¹ý³ÌÓÖ½Ð×ö×·×Ù£¬×·×ÙËùÓпɱ»·ÃÎʵĶÔÏó¡£
À¬»øÊÕ¼¯µÄµÚ¶þ²½¾ÍÊÇ»ØÊÕÄÚ´æ¡£ÔÚMark½×¶Îͨ¹ýmarkBitsλͼ¿ÉÒԵõ½ËùÓпɷÃÎʵĶÔÏ󼯺ϣ¬¶øliveBitsλͼ±íʾËùÓÐÒѾ·ÖÅäµÄ¶ÔÏ󼯺ϡ£Í¨¹ý±È½ÏliveBitsλͼºÍmarkBitsλͼµÄ²îÒì¾ÍÊÇËùÓпɻØÊյĶÔÏ󼯺ϡ£Sweep½×¶Îµ÷ÓÃfreeÀ´ÊÍ·ÅÕâЩÄÚ´æ¸ø¶Ñ¡£
ÔڵײãÄÚ´æÊµÏÖÉÏ£¬AndroidϵͳʹÓõÄÊÇmsspace£¬ÕâÊÇÒ»¸öÇáÁ¿¼¶µÄmallocʵÏÖ¡£³ýÁË´´½¨ºÍ³õʼ»¯ÓÃÓÚ´æ´¢ÆÕͨJava¶ÔÏóµÄÄÚ´æ¶Ñ£¬Android»¹´´½¨Èý¸ö¶îÍâµÄÄÚ´æ¶Ñ£º
¡°livebits¡±(ÓÃÀ´´æ·Å¶ÑÉÏÄÚ´æ±»Õ¼ÓÃÇé¿öµÄλͼË÷Òý)
¡°markbits¡±(ÔÚGCʱÓÃÓÚ±ê×¢´æ»î¶ÔÏóµÄλͼË÷Òý)
¡°markstack¡±(ÔÚGCÖбéÀú´æ»î¶ÔÏóÒýÓõıê×¢Õ»)
ÐéÄâ»úͨ¹ýÒ»¸öÃûΪgHsµÄÈ«¾ÖHeapSource±äÁ¿À´²Ù¿ØGCÄÚ´æ¶Ñ£¬¶øHeapSourceÀïͨ¹ýheapsÊý×é¿ÉÒÔ¹ÜÀí¶à¸ö¶Ñ(Heap)£¬ÒÔÂú×㶯̬µ÷ÕûGCÄÚ´æ¶Ñ´óСµÄÒªÇó¡£ÁíÍâHeapSourceÀﻹά»¤Ò»¸öÃûΪ¡±livebits¡±µÄλͼË÷Òý£¬ÒÔ¸ú×Ù¸÷¸ö¶Ñ(Heap)µÄÄÚ´æÊ¹ÓÃÇé¿ö¡£Ê£ÏÂÁ½¸öÊý¾Ý½á¹¹¡±markstack¡±ºÍ¡±markbits¡±¶¼ÊÇÓÃÔÚÀ¬»ø»ØÊս׶Ρ£

ÉÏͼÖС±livebits¡±Î¬»¤¶ÑÉÏÒÑÓõÄÄÚ´æÐÅÏ¢£¬¶ø¡±markbits¡±Õâ¸öλͼË÷ÒýÔòÖ¸Ïò´æ»îµÄ¶ÔÏó¡£
A¡¢C¡¢F¡¢G¡¢H¶ÔÏóÐèÒª±£Áô£¬Òò´Ë¡±markbits¡±·Ö±ðÖ¸ÏòËûÃÇ(×îºóµÄH¶ÔÏóÉÐÔÚ±ê×¢¹ý³ÌÖУ¬Òò´ËûÓÐÖ¸ÕëÖ¸ÏòËü)¡£¶ø¡±markstack¡±¾ÍÊÇÔÚ±ê×¢¹ý³ÌÖиú×Ùµ±Ç°ÐèÒª´¦ÀíµÄ¶ÔÏóÒªÓõ½µÄ±êÖ¾Õ»£¬´ËʱÆä±£´æÁËÕýÔÚ´¦ÀíµÄ¶ÔÏóF¡¢GºÍH¡£
4.5 DalvikµÄÆô¶¯Á÷³Ì
Dalvik½ø³Ì¹ÜÀíÊÇÒÀÀµÓÚlinuxµÄ½ø³ÌÌåϵ½á¹¹µÄ£¬ÈçҪΪӦÓóÌÐò´´½¨Ò»¸ö½ø³Ì£¬Ëü»áʹÓÃlinuxµÄfork»úÖÆÀ´¸´ÖÆÒ»¸ö½ø³Ì¡£ZygoteÊÇÒ»¸öÐéÄâ»ú½ø³Ì£¬Í¬Ê±Ò²ÊÇÒ»¸öÐéÄâ»úʵÀýµÄ·õ»¯Æ÷£¬Ëüͨ¹ýinit½ø³ÌÆô¶¯¡£Ö®Ç°µÄÎÄÕÂÓжԴ˹ý³ÌÓÐÏêϸ½éÉÜ£ºAndroidϵͳÆô¶¯·ÖÎö(Init->Zygote->SystemServer->Home
activity)¡£´Ë´¦·ÖÎöDalvikÐéÄâ»úÆô¶¯µÄÏà¹Ø¹ý³Ì¡£

AndroidRuntimeÀàÖ÷Òª×öÁËÒÔϼ¸¼þÊÂÇ飺
µ÷ÓÃstartVM´´½¨Ò»¸öDalvikÐéÄâ»ú£¬JNI_CreateJavaVMÕæÕý´´½¨²¢³õʼ»¯ÐéÄâ»úʵÀý
µ÷ÓÃstartReg×¢²áAndroidºËÐÄÀàµÄJNI·½·¨
ͨ¹ýZygote½ø³Ì½øÈëJava²ã
ÔÚJNIÖУ¬dvmCreateJNIEnvΪµ±Ç°Ï̴߳´½¨ºÍ³õʼ»¯Ò»¸öJNI»·¾³£¬¼´Ò»¸öJNIEnvExt¶ÔÏó¡£×îºóµ÷ÓÃdvmStartupÀ´³õʼ»¯Ç°Ãæ´´½¨µÄDalvikÐéÄâ»úʵÀý¡£º¯ÊýdvmInitZygoteµ÷ÓÃÁËϵͳµÄsetpgidÀ´ÉèÖõ±Ç°½ø³Ì£¬¼´Zygote½ø³ÌµÄ½ø³Ì×éID¡£ÕâÒ»²½Íê³Éºó£¬DalvikÐéÄâ»úµÄ´´½¨ºÍ³õʼ»¯¹¤×÷¾ÍÍê³ÉÁË¡£
5. AndroidµÄÆô¶¯
Æô¶¯µçÔ´£¬¼ÓÔØÒýµ¼³ÌÐòµ½RAM
BootLoaderÒýµ¼
Linux KernelÆô¶¯
Init½ø³Ì´´½¨
Init fork³öZygote½ø³Ì£¬Zygote½ø³Ì´´½¨ÐéÄâ»ú;´´½¨ÏµÍ³·þÎñ
Android Home LauncherÆô¶¯

|