本篇文章主要介绍了"ART运行时Java堆创建过程分析",主要涉及到require,计数器,Dalvik虚拟机方面的内容,对于移动开发感兴趣的同学可以参考一下:
与Dalvik虚拟机一样,ART运行时内部也有一个Java堆,用来分配Java对象。当这些Java对象不再被使用时,ART运行时需要回收它们占...
与Dalvik虚拟机一样,ART运行时内部也有一个Java堆,用来分配Java对象。当这些Java对象不再被使用时,ART运行时需要回收它们占用的内存。在前面一文中,我们简要介绍了ART运行时的垃圾收集机制,从中了解到ART运行时内部使用的Java堆是由四种Space以及各种辅助数据结构共同描述的。为了后面可以更好地分析ART运行时的垃圾收集机制,本文就对它内部使用的Java堆的创建过程进行分析。
老罗的新浪微博:http://weibo.com/shengyangluo,欢迎关注!
ART运行时创建Java堆的过程,实际上就是创建在图1涉及到的各种数据结构:

图1 ART运行时堆的基本概念以及组成
从图1可以看到,ART运行时内部使用的Java堆的主要组成包括Image Space、Zygote Space、Allocation Space和Large Object Space四个Space,两个Mod Union Table,一个Card Table,两个Heap Bitmap,两个Object Map,以及三个Object Stack。这些数据结构的介绍和作用可以参考前面ART运行时垃圾收集机制简要介绍和学习计划一文,接下来我们主要是分析它们的创建过程。
从前面Android运行时ART加载OAT文件的过程分析一文可以知道,ART运行时内部使用的堆是在ART运行时初始化过程中创建的,即在Runtime类的成员函数Init中创建的,如下所示:
[cpp]
view plain
copy


- bool Runtime::Init(const Options& raw_options, bool ignore_unrecognized) {
- ......
-
- UniquePtr options(ParsedOptions::Create(raw_options, ignore_unrecognized));
- ......
-
- heap_ = new gc::Heap(options->heap_initial_size_,
- options->heap_growth_limit_,
- options->heap_min_free_,
- options->heap_max_free_,
- options->heap_target_utilization_,
- options->heap_maximum_size_,
- options->image_,
- options->is_concurrent_gc_enabled_,
- options->parallel_gc_threads_,
- options->conc_gc_threads_,
- options->low_memory_mode_,
- options->long_pause_log_threshold_,
- options->long_gc_log_threshold_,
- options->ignore_max_footprint_);
-
- ......
- }
这个函数定义在文件art/runtime/runtime.cc中。 Runtime类的成员函数Init首先是调用ParsedOptions类的静态成员函数Create解析ART运行时的启动选项,并且保存在变量options指向的一个ParsedOptions对象的各个成员变量中,与堆相关的各个选项的含义如下所示:
1. options->heap_initial_size_: 堆的初始大小,通过选项-Xms指定。
2. options->heap_growth_limit_: 堆允许增长的上限值,这是堆的一个软上限值,通过选项-XX:HeapGrowthLimit指定。
3. options->heap_min_free_: 堆的最小空闲值,通过选项-XX:HeapMinFree指定。
4. options->heap_max_free_: 堆的最大空闲值,通过选项-XX:HeapMaxFree指定。
5. options->heap_target_utilization_: 堆的目标利用率,通过选项-XX:HeapTargetUtilization指定。
6. options->heap_maximum_size_: 堆的最大值,这是堆的一个硬上限值,通过选项-Xmx指定。