| 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函数针对并行和串行两种gc的流程图
图.2、ART的堆结构Mod Union Table对象 一个用来记录在GC并行阶段在Image Space上分配的对象对在Zygote Space和Allocation Space上分配的对象的引用。另一个用来记录在GC并行阶段在Zygote Space上分配的对象对在Allocation Space上分配的对象的引用。Allocation Stack:用来记录上一次GC后分配的对象,用来实现类型为Sticky的Mark Sweep Collector。Live Stack:配合allocation_stack_一起使用,用来实现类型为Sticky的Mark Sweep Collector。Mark Stack:用来在GC过程中实现递归对象标记
图.3、在OAT文件中查找类方法的本地机器指令的过程我们从左往右来看图.3。首先是根据类签名信息从包含在OAT文件里面的DEX文件中查找目标Class的编号,然后再根据这个编号找到在OAT文件中找到对应的OatClass。接下来再根据方法签名从包含在OAT文件里面的DEX文件中查找目标方法的编号,然后再根据这个编号在前面找到的OatClass中找到对应的OatMethod。有了这个OatMethod之后,我们就根据它的成员变量begin_和code_offset_找到目标类方法的本地机器指令了。其中,从DEX文件中根据签名找到类和方法的编号要求对DEX文件进行解析,这就需要利用Dalvik虚拟机的知识了。新闻热点
疑难解答