概述
Hotspot虚拟机中常见的即时编译器包括客户端编译器和服务端编译器,也被称为C1编译器和C2编译器。C1编译器能够做出一些快速优化,而C2编译器所作的优化会消耗更多的时间,但能够产生更高效的代码。
调用链
JavaThread::thread_main_entry()
-> compiler_thread_entry()
-> CompilerBroker::compiler_thread_loop()
-> CompileBroker::invoke_compiler_on_method() // 使用C1
-> Compiler::compile_method() // 进入C1世界
-> Compilation::Compilation() // 代码编译
-> Compilation::compile_method()
-> Compilation::compile_java_method()
C1的完整编译周期等价于Compilation对象的构造周期。 Compilation::compile_method包含编译代码和安装编译后代码两个动作。Compilation::compile_java_method表示编译动作。
int Compilation::compile_java_method() {
assert(!method()->is_native(), "should not reach here");
if (BailoutOnExceptionHandlers) {
if (method()->has_exception_handlers()) {
bailout("linear scan can't handle exception handlers");
}
}
CHECK_BAILOUT_(no_frame_siz