| 12345678910 | struct GcSpec {/* If true, only the application heap is threatened. */bool isPartial; /* If true, the trace is run concurrently with the mutator. */bool isConcurrent; /* Toggles for the soft reference clearing policy. */bool doPreserve; /* A name for this garbage collection mode. */constchar*reason; }; | 
 圖.1、dvmCollectGarbageInternal函數(shù)針對并行和串行兩種gc的流程圖
 圖.1、dvmCollectGarbageInternal函數(shù)針對并行和串行兩種gc的流程圖 圖.2、ART的堆結(jié)構(gòu)Mod Union Table對象 一個用來記錄在GC并行階段在Image Space上分配的對象對在Zygote Space和Allocation Space上分配的對象的引用。另一個用來記錄在GC并行階段在Zygote Space上分配的對象對在Allocation Space上分配的對象的引用。Allocation Stack:用來記錄上一次GC后分配的對象,用來實(shí)現(xiàn)類型為Sticky的Mark Sweep Collector。Live Stack:配合allocation_stack_一起使用,用來實(shí)現(xiàn)類型為Sticky的Mark Sweep Collector。Mark Stack:用來在GC過程中實(shí)現(xiàn)遞歸對象標(biāo)記
圖.2、ART的堆結(jié)構(gòu)Mod Union Table對象 一個用來記錄在GC并行階段在Image Space上分配的對象對在Zygote Space和Allocation Space上分配的對象的引用。另一個用來記錄在GC并行階段在Zygote Space上分配的對象對在Allocation Space上分配的對象的引用。Allocation Stack:用來記錄上一次GC后分配的對象,用來實(shí)現(xiàn)類型為Sticky的Mark Sweep Collector。Live Stack:配合allocation_stack_一起使用,用來實(shí)現(xiàn)類型為Sticky的Mark Sweep Collector。Mark Stack:用來在GC過程中實(shí)現(xiàn)遞歸對象標(biāo)記  圖.3、在OAT文件中查找類方法的本地機(jī)器指令的過程我們從左往右來看圖.3。首先是根據(jù)類簽名信息從包含在OAT文件里面的DEX文件中查找目標(biāo)Class的編號,然后再根據(jù)這個編號找到在OAT文件中找到對應(yīng)的OatClass。接下來再根據(jù)方法簽名從包含在OAT文件里面的DEX文件中查找目標(biāo)方法的編號,然后再根據(jù)這個編號在前面找到的OatClass中找到對應(yīng)的OatMethod。有了這個OatMethod之后,我們就根據(jù)它的成員變量begin_和code_offset_找到目標(biāo)類方法的本地機(jī)器指令了。其中,從DEX文件中根據(jù)簽名找到類和方法的編號要求對DEX文件進(jìn)行解析,這就需要利用Dalvik虛擬機(jī)的知識了。
圖.3、在OAT文件中查找類方法的本地機(jī)器指令的過程我們從左往右來看圖.3。首先是根據(jù)類簽名信息從包含在OAT文件里面的DEX文件中查找目標(biāo)Class的編號,然后再根據(jù)這個編號找到在OAT文件中找到對應(yīng)的OatClass。接下來再根據(jù)方法簽名從包含在OAT文件里面的DEX文件中查找目標(biāo)方法的編號,然后再根據(jù)這個編號在前面找到的OatClass中找到對應(yīng)的OatMethod。有了這個OatMethod之后,我們就根據(jù)它的成員變量begin_和code_offset_找到目標(biāo)類方法的本地機(jī)器指令了。其中,從DEX文件中根據(jù)簽名找到類和方法的編號要求對DEX文件進(jìn)行解析,這就需要利用Dalvik虛擬機(jī)的知識了。新聞熱點(diǎn)
疑難解答