// 代码阅读过程中,部分参考来自邓凡平老师的《深入理解ART虚拟机》一书
bool Runtime::Init(RuntimeArgumentMap&& runtime_options_in) {
......
// C++的using语法,可以理解为Opt是RUntimeArgumentMap的别名
using Opt = RuntimeArgumentMap;
Opt runtime_options(std::move(runtime_options_in));
......
// MemMap初始化,MemMap用于管理内存映射。ART虚拟机内大量的使用了内存映射技术。
// 比如oat文件记载过程就会使用内存映射将文件内容映射到虚拟机内
MemMap::Init();
......
// 如其名,OatFileManager是用来管理虚拟机内部的Oat文件的
oat_file_manager_ = new OatFileManager;
......
// Monitor初始化,Monitor是虚拟机的关键模块,是用来实现线程同步的。
Monitor::Init(runtime_options.GetOrDefault(Opt::LockProfThreshold),
runtime_options.GetOrDefault(Opt::StackDumpLockProfThreshold));
......
// 提取传递过来的参数,Init接下来部分有很多这样的初始化动作
boot_class_path_ = runtime_options.ReleaseOrDefault(Opt::BootClassPath);
boot_class_path_locations_ = runtime_options.ReleaseOrDefault(Opt::BootClassPathLocations);
DCHECK(boot_class_path_locations_.empty() ||
boot_class_path_locations_.size() == boot_class_path_.size());
if (boot_class_path_.empty()) {
......
// A. MonitorList用于维护一组Monitor对象
// B. MonitorPool,如其名是个Monitor池,加速创建Monitor对象
// C. ThreadList用于维护ART内部的线程对象
// D. InternTable和string intern table有关,是字符串常量池
monitor_list_ = new MonitorList;
monitor_pool_ = MonitorPool::Create();
thread_list_ = new ThreadList(runtime_options.GetOrDefault(Opt::ThreadSuspendTimeout));
intern_table_ = new InternTable;
......
// 从传递的参数中获取虚拟机对hidden api的策略
hidden_api_policy_ = runtime_options.GetOrDefault(Opt::HiddenApiPolicy);
DCHECK(!is_zygote_ || hidden_api_policy_ == hiddenapi::EnforcementPolicy::kDisabled);
......
// 非常关键的地方,ART虚拟机内部Heap模块
heap_ = new gc::Heap(runtime_options.GetOrDefault(Opt::MemoryInitialSize),
......
);
......
// ArenaPool以及LinearAlloc:runtime内部需要创建喝多对象或者存储一些信息,因此虚拟机内部为了更好的管理,设计了
// A.内存池AreanPool,ArenaPool可管理多个内存单元
// B.内存分配器LinearAlloc,使用LinearAlloc可在ArenaPool中分配任意大小的内存
const bool use_malloc = IsAotCompiler();
if (use_malloc) {
arena_pool_.reset(new MallocArenaPool());
jit_arena_pool_.reset(new MallocArenaPool());
} else {
arena_pool_.reset(new MemMapArenaPool(/* low_4gb= */ false));
jit_arena_pool_.reset(new MemMapArenaPool(/* low_4gb= */ false, "CompilerMetadata"));
}
if (IsAotCompiler() && Is64BitInstructionSet(kRuntimeISA)) {
// 4gb, no malloc. Explanation in header.
low_4gb_arena_pool_.reset(new MemMapArenaPool(/* low_4gb= */ true));
}
linear_alloc_.reset(CreateLinearAlloc());
// 接下来的内容是和信号处理有关系。
// 这里是阻塞SIGPIPE、SIGQUIT和SIGUSER1信号
BlockSignals();
// 这里是为某些信号设置自定义的信号处理函数。
InitPlatformSignalHandlers();
......
// 对运行在目标设备上的ART虚拟机来说,no_sig_chain_取默认值false
if (!no_sig_chain_) {
// A. implicit_null_checks_ 是否启用隐式指针检查,此处取值为true
// B. implicit_so_checks_ 是否启用隐式堆栈溢出检查,此处取值为true
// C. implicit_suspend_checks_ 是否启用隐式线程暂停检查,此处取值为false
if (implicit_null_checks_ || implicit_so_checks_ || implicit_suspend_checks_) {
// FaltManager模块是用于处理SIGSEV信号
fault_manager.Init();
if (implicit_suspend_checks_) {
new SuspensionHandler(&fault_manager);
}
if (implicit_so_checks_) {
new StackOverflowHandler(&fault_manager);
}
if (implicit_null_checks_) {
new NullPointerHandler(&fault_manager);
}
if (kEnableJavaStackTraceHandler) {
new JavaStackTraceHandler(&fault_manager);
}
}
}
......
// 调用JavaVMExt的create方法了,JavaVMExt就是JNI中代表Java虚拟机的对象,其基类为JavaVM,真是
// 类型是JavaVmExt。根据JNI规范,一个进程只有唯一的一个JavaVM对象。
java_vm_ = JavaVMExt::Create(this, runtime_options, &error_msg);
if (java_vm_.get() == nullptr) {
LOG(ERROR) << "Could not initialize JavaVMExt: " << error_msg;
return false;
}
......
// Thread代表ART虚拟机中的线程类
Thread::Startup();
Thread* self = Thread::Attach("main", false, nullptr, false);
......
// 创建ClassLinker,这里会分情况创建,但是从代码中可以知道,绝大部分时候IsAotCompiler取值为false的
// 查看代码可以知道IsAotCompiler是只在dex2oat环境中才有可能取值为true,所以这里的是new ClassLinker
// ClassLinker是关键的模块,是底层进行class相关处理的地方,例如解析或者查找某个类
if (UNLIKELY(IsAotCompiler())) {
class_linker_ = new AotClassLinker(intern_table_);
} else {
class_linker_ = new ClassLinker(
intern_table_,
runtime_options.GetOrDefault(Opt::FastClassNotFoundException));
}
// 接下来就是初始化class_linker_,将一些boot class类加载进去
if (GetHeap()->HasBootImageSpace()) {
bool result = class_linker_->InitFromBootImage(&error_msg);
......
class_linker_->AddExtraBootDexFiles(self, std::move(extra_boot_class_path));
......
} else {
......
if (!class_linker_->InitWithoutImage(std::move(boot_class_path), &error_msg)) {
......
CHECK(class_linker_ != nullptr);
// ClassVerifier模块,用于对classLinker进行校验
verifier::ClassVerifier::Init(class_linker_);
// native bridge library加载
if (IsZygote() && IsPerfettoHprofEnabled()) {
constexpr const char* plugin_name = kIsDebugBuild ?
"libperfetto_hprofd.so" : "libperfetto_hprof.so";
// Load eagerly in Zygote to improve app startup times. This will make
// subsequent dlopens for the library no-ops.
dlopen(plugin_name, RTLD_NOW | RTLD_LOCAL);
}
// oat_file_manager处理
if (runtime_options.Exists(Opt::OnlyUseSystemOatFiles)) {
oat_file_manager_->SetOnlyUseSystemOatFiles();
}
return true;
}