美文网首页CODE REVIEW INDEX
HOTSPOT JVM 1.6 CODE REVIEW

HOTSPOT JVM 1.6 CODE REVIEW

作者: hnail | 来源:发表于2018-05-09 20:21 被阅读0次

    导语

    1.HotSpot内部的各个模块是如何初始化的?
    2.类的装载、链接、初始化在HotSpot中是如何完成的?
    3.HotSpot如何执行java方法中的字节码?
    4.HotSpot如何实现GC?//TODO:
    5.HotSpot如何实现JIT编译器?//TODO:
    

    HOTSPOT JVM执行引擎OpenJDK 1.6版本跟1.8版本变化不大,整理了一份index,一是为了梳理思路,二是为了后续查问题可以基于index快速troubleshoot。


    一.index

    执行引擎代码主要包含三部分:
    JVM初始化 : 1.1 main流程
    类静态处理 : 1.2 class parse、1.3 class resolve
    类方法解释执行 : 1.4 cppInterpreter_zero

    1.1 main流程
    share/bin/java.c#main
        ->os\posix\launcher\java_md.c#ContinueInNewThread(创建新线程,执行CreateJavaVM方法,并join到主线程上) -> share\vm\prims\jni.cpp#JNI_CreateJavaVM 
            ->Threads::create_vm
                ->new JavaThread->set_thread_state(_thread_new),顺便初始化线程的一些存储结构
                ->runtime\init.cpp#init_globals
                    ->bytecodes_init()初始化bytecode定义
                    ->classLoader_init()设置bootstrapClassLoader搜索路径
                    ->StubRoutines::initialize1(生成部分入口stub_entry)
                        -><zero>stubGenerator_zero.cpp#StubGenerator_generate || <template>stubGenerator_x86_32.cpp#StubGenerator_generate
                            ->stubGenerator_zero.cpp#generate_initial->StubRoutines::_call_stub_entry=stubGenerator_zero.cpp#call_stub(..)
                    ->universe_init(初始化heap、SymbolTable等)
                        ->Universe::initialize_heap();
                            ->基于gc_policy 设置 Universe::_collectedHeap-> Universe::heap()->initialize()
                        ->SymbolTable::create_table();
                    ->interpreter_init(生成各类方法的解释器函数入口)
                        ->template interpreter
                            ->TemplateInterpreter::initialize
                                ->TemplateTable::initialize()(生成各Bytecodes的汇编函数代码)
                                ->TemplateInterpreterGenerator::generate_all(生成各类型函数的method_entry)
                                    ->method_entry(zerolocals) || method_entry(native)
                                        ->x86\vm\templateInterpreter_x86_64.cpp#AbstractInterpreterGenerator::generate_method_entry
                                            ->templateInterpreter_x86_64.cpp##InterpreterGenerator::generate_normal_entry || generate_native_entry() -> 基于各指令集的assembler生成汇编代码
                        ->zero interpreter
                            ->CppInterpreter::initialize
                                ->stubGenerator_zero.cpp#generate_all
                    ->SharedRuntime::generate_stubs(compiled code to call a (static) C++ runtime routine,好像生成的函数C1或是直接调用会用到,但是代码思路还是很有意思的,值得一看)
                        ->_resolve_virtual_call_blob=SharedRuntime::resolve_virtual_call_C && _resolve_static_call_blob=SharedRuntime::resolve_static_call_C
                            ->runtime/sharedRuntime.cpp#SharedRuntime::resolve_helper()
                                ->SharedRuntime::resolve_sub_helper()
                                    ->LinkResolver::resolve_invoke()
                                        ->interpreter\linkResolver.cppresolve_invokestatic || resolve_invokevirtual || resolve_invokeinterface
                                            ->LinkResolver::resolve_pool()
                                                ->LinkResolver::resolve_klass
                                                    ->constantPoolOop.cpp#constantPoolOopDesc::klass_at_impl(resolve caller常量池中被调用class类,并最终替换常量池Symbol为Klass的直接引用)
                                            ->LinkResolver::resolve_virtual_call || LinkResolver::resolve_static_call [TODO://]
                                                ->LinkResolver::resolve_virtual_call
                                                    ->LinkResolver::linktime_resolve_virtual_method(静态 link)
                                                    ->LinkResolver::runtime_resolve_virtual_method(runtime link)
                                                ->LinkResolver::resolve_static_call
                    ->memory\universe.cpp#universe2_init->Universe::genesis()
                        ->初始化Universe中各类通用klass单例,比如klassKlass、methodKlass、constMethodKlass
                        ->vmSymbols::initialize//Symbols提前插入系统常用Symbol,比如常用类、方法、字符串等java/lang/String,<clinit>..
                        ->SystemDictionary::initialize
                            ->SystemDictionary::initialize_preloaded_classes
                                ->SystemDictionary::initialize_wk_klass
                                    ->SystemDictionary::_well_known_klasses=SystemDictionary::resolve_or_fail()
                                        ->SystemDictionary::resolve_instance_class_or_null[TODO://]
                    ->runtime/jniHandles.cpp#jni_handles_init()
                        ->JNIHandles::_global_handles(static的,说明JNI方法是全局?)
                    ->universe.cpp#universe_post_init
                        ->universe.cpp#_finalizer_register_cache->init()
                        ->Universe::_reflect_invoke_cache->init()
                        ->Universe::_loader_addClass_cache->init()
                        ->Universe::heap()->post_initialize();
                    ->javaClasses.cpp#javaClasses_init->JavaClasses::compute_offsets()(初始化系统类中各个field的offset,可以直接基于内存位置加速读取)
                    ->stubRoutines_init2(跟stubRoutines_init1没有啥差距啊?)
                ->VMThread::create()
                ->os::start_thread(vmthread)
                ->InitializeJavaLangSystem->java_lang_System、java_lang_ThreadGroup、java_lang_Thread等java thread用到的类
                ->create_initial_thread()
                    ->JavaThread._threadObj=JavaCalls::call_special->java.lang.init(...,"main",...)[#TODO:JavaCalls::call_special函数解析下]
                ->java_lang_Thread::set_thread_status(thread_object,java_lang_Thread::RUNNABLE);
                ->java.lang.System#initializeSystemClass
                ->initialize_class(vmSymbols::java_lang_Compiler())[TODO://compiler相关目前都跳过]
                ->prims/jni.cpp#quicken_jni_functions()->jni_NativeInterface jni_method_stub初始化,用于JNI的函数指针
                ->set_init_completed()
        ->share/bin/java.c#JavaMain
            ->share/bin/java.c#LoadMainClass()
                ->a)jdk/src/share/bin/java.c#GetLauncherHelperClass(env)
                ->b)hotspot/src/share/vm/prims/jni.cpp#get_method_id
                    ->JNIHandles::resolve_non_null(clazz)
                    ->Klass::cast(klass())->initialize(CHECK_NULL);
                    ->klass->lookup_method(name, signature);
                ->c)CallStaticObjectMethod->vm/prims/jni.cpp#jni_Call##Result##MethodV
                    ->vm/prims/jni.cpp#jni_invoke_static
                ->[abc4this]sun.launcher.LauncherHelper.checkAndLoadMain
                    ->ClassLoader.getSystemClassLoader().loadClass(var3)
                        ->Launcher.AppClassLoader.getAppClassLoader获取AppClassLoader作为加载器加载main方法
                            ->AppClassLoader.loadClass()
                                ->findLoadedClass->java.lang.ClassLoader.findLoadedClass0->hotspot/src/share/vm/prims/jvm.cpp#JVM_FindLoadedClass->SystemDictionary::find_instance_or_array_klass
                                ->super.loadClass(委托父类加载器加载)
                ->mainID = (*env)->GetStaticMethodID(env, mainClass, "main","([Ljava/lang/String;)V");//同上
                ->(*env)->CallStaticVoidMethod(env, mainClass, mainID, mainArgs);(执行main方法)
                    ->/vm/prims/jni.cpp#jni_CallStaticVoidMethod
                        ->vm/prims/jni.cpp#jni_invoke_static
                            ->JavaCalls::call
                                ->JavaCalls::call_helper
                                    ->address entry_point = method->from_interpreted_entry()
                                    ->StubRoutines::call_stub()() 即StubRoutines::_call_stub_entry()
                                        ->stubGenerator_x86_32.cpp#generate_call_stub || stubGenerator_zero.cpp#call_stub
                                            ->thread->zero_stack()->setup(alloca(zero_stack_size), zero_stack_size)
                                            ->EntryFrame::build(parameters, parameter_words, call_wrapper, THREAD)
                                                ->set next_frame_off,frame_type_off,call_wrapper_off,parameters
                                            ->thread->push_zero_frame(frame);设置thread的frame
                                            ->Interpreter::invoke_method(method, entry_point, THREAD);
                                                ->oops/methodOop.hpp#_from_interpreted_entry()(切换到解释器方法代码地址开始执行)
                                                    ->cppInterpreter_zero.cpp#AbstractInterpreterGenerator::generate_method_entry || templateInterpreter_x86_32.cpp#3AbstractInterpreterGenerator::generate_method_entry(本函数入口address是基于method kind赋值的固定地址)
                                                        ->cppInterpreter_zero.cpp#InterpreterGenerator::generate_normal_entry
                                                            ->cppInterpreter_zero.cpp#CppInterpreter::normal_entry[GOTO:<cppInterpreter_zero执行引擎流程>]
                                            ->result = *(jlong *) stack->sp();(将栈顶缓存作为结果保存下来)
                                            ->thread->pop_zero_frame();
            ->(*vm)->DetachCurrentThread(vm)
            ->(*vm)->DestroyJavaVM(vm);
    
    1.2 类字节码静态解析
    classFileParser.cpp#ClassFileParser::parseClassFile
        ->u4 magic = cfs->get_u4_fast();
        ->u2 minor_version = cfs->get_u2_fast();u2 major_version = cfs->get_u2_fast();
        ->classfile/classFileParser.cpp#ClassFileParser::parse_constant_pool
            ->constant_pool =oopFactory::new_constantPool(length,oopDesc::IsSafeConc,CHECK_(nullHandle));
            ->ClassFileParser::parse_constant_pool_entries
                ->tag->case JVM_CONSTANT_Utf8 || JVM_CONSTANT_Methodref||...//字符串保存到SymbolTable
        ->access_flags
        ->this_class_index = cfs->get_u2_fast();//This class
        ->super_class_index = cfs->get_u2_fast();//superclass,super class的resolve见下
        ->ClassFileParser::parse_interfaces // Interfaces
            ->klassOop k = SystemDictionary::resolve_super_or_fail//resolve interface,不太明白起名叫super,接口认为是当前类的super?
                ->SystemDictionary::resolve_or_null(class_name,class_loader,protection_domain,THREAD)
                    ->SystemDictionary::resolve_instance_class_or_null
            ->interfaces->obj_at_put(index, interf());//
        ->ClassFileParser::parse_fields
            ->typeArrayOop new_fields = oopFactory::new_permanent_shortArray((length + num_injected) * FieldInfo::field_slots, CHECK_(nullHandle));
            ->access_flags=cfs->get_u2_fast()
            ->name_index = cfs->get_u2_fast();
            ->signature_index = cfs->get_u2_fast();
            ->ClassFileParser::parse_field_attributes //annotation等.
                ->ClassFileParser::assemble_annotations
            ->field->initialize()//设置offset
        ->ClassFileParser::parse_methods
            -> objArrayOop m = oopFactory::new_system_objArray(length, CHECK_(nullHandle));
            ->ClassFileParser::parse_method
                ->int flags = cfs->get_u2_fast();
                ->u2 name_index = cfs->get_u2_fast();
                ->u2 signature_index = cfs->get_u2_fast();
                ->method_attribute_name_index = cfs->get_u2_fast();method_attribute_length = cfs->get_u4_fast();//Parse code and exceptions attribute
                    ->CASE(:vmSymbols::tag_code())
                        ->ClassFileParser::parse_exception_table
                        ->Parse additional attributes in code attribute
                            ->CASE(:tag_line_number_table)
                                ->ClassFileParser::parse_linenumber_table
                            ->CASE(:tag_local_variable_table)
                                ->ClassFileParser::parse_localvariable_table
                    ->CASE(:vmSymbols::tag_exceptions())
                        ->ClassFileParser::parse_checked_exceptions
                    ->CASE(:vmSymbols::tag_runtime_visible_annotations())
                    ->CASE(:vmSymbols::tag_runtime_visible_annotations())
                ->methodOop m_oop=oopFactory::new_method(code_length, access_flags, linenumber_table_length,total_lvt_length, checked_exceptions_length,oopDesc::IsSafeConc, CHECK_(nullHandle));
                    ->constMethodOop cm = new_constMethod()
                    ->mk->allocate(cm, access_flags, CHECK_NULL)
                ->m->set_constants(cp());
                ->m->set_name_index(name_index);m->set_signature_index(signature_index);m->set_generic_signature_index(generic_signature_index)//generic为未擦除除泛型的
                ->m->set_size_of_parameters(args_size);
                ->m->set_max_stack(max_stack);m->set_max_locals(max_locals); // Fill in code attribute information
                ->// Copy byte codes 
                ->// Copy line number table
                ->//Copy checked exceptions
                ->//LocalVariableTable and LocalVariableTypeTable
                ->assemble_annotations
                    ->method_annotations
                    ->method_parameter_annotations
                    ->method_default_annotations
            ->methods_annotations//methods_annotations_oop,methods_parameter_annotations_oop,methods_default_annotations_oop
        ->super_klass=SystemDictionary::resolve_super_or_fail()//resolve super class
        ->ClassFileParser::compute_transitive_interfaces //父类实现的接口+当前类实现的接口
            ->super_size = super->transitive_interfaces()->length();
            ->max_transitive_size += instanceKlass::cast(l)->transitive_interfaces()->length();
            ->transitive_interfaces = objArrayHandle(THREAD, max_transitive_size);
            ->classfile/classFileParser.cpp#append_interfaces //将所有接口去重后加入transitive_interfaces
        ->ClassFileParser::sort_methods//排序当前类的所有method对象
            ->methodOopDesc::sort_methods
                ->m->set_method_idnum(i); -> constMethodOopDesc._method_idnum
        ->oops/klassVtable.cpp#klassVtable::compute_vtable_size_and_num_mirandas //计算vtable大小,包括mirandas方法
        ->oops/klassVtable.cpp#klassItable::compute_itable_size //所有接口的method都加进来
            ->visit_all_interfaces(transitive_interfaces(), &cic);
        ->oop_map
        ->klassOop ik = oopFactory::new_instanceKlass(name, vtable_size, itable_size,static_field_size,total_oop_map_count,rt, CHECK_(nullHandle)) // 创建instanceKlass
        ->this_klass->set_access_flags(access_flags);
        ->this_klass->set_class_loader(class_loader());
        ->this_klass->set_local_interfaces(local_interfaces());
        ->this_klass->set_fields(fields(), java_fields_count);
        ->this_klass->set_methods(methods());
        ->this_klass->set_constants(cp());
        ->this_klass->set...
        ->ClassFileParser::parse_classfile_attributes //vmSymbols::tag_source_file等
        ->this_klass->set_transitive_interfaces
        ->oops/klassVtable.cpp#klassItable::setup_itable_offset_table(this_klass);
            ->klassItable::setup_itable_offset_table
        ->fill_oop_maps(this_klass, nonstatic_oop_map_count, nonstatic_oop_offsets, nonstatic_oop_counts);
        ->java_lang_Class::create_mirror(this_klass, CHECK_(nullHandle));
            ->oops/klassVtable.cpp#visit_all_interfaces
    
    1.3 resolve解决symbol到oop地址的问题
    interpreter/linkResolver.cpp#LinkResolver::resolve_invoke
        ->resolve_invokestatic->LinkResolver::resolve_invokestatic
            ->LinkResolver::resolve_pool
                ->LinkResolver::resolve_klass
                    ->oops/constantPoolOop.cpp#constantPoolOopDesc::klass_at_impl
                        ->classfile/systemDictionary.cpp#SystemDictionary::resolve_or_fail(name, instanceKlass::cast(this_oop->pool_holder())->class_loader(), h_prot, true, THREAD);//使用当前前类的class_loader resolve class
                            ->classfile/systemDictionary.cpp#SystemDictionary::resolve_instance_class_or_null
                                ->SystemDictionary._dictionary->find(d_index, d_hash, name, class_loader,protection_domain, THREAD)[注2:]
                                ->placeholder check class loading is in progress
                                ->SystemDictionary::load_instance_class(name, class_loader, THREAD);// Doz actual loading[TODO://]
                                    ->JavaCalls::call_virtual(&result,class_loader,spec_klass,vmSymbols::loadClass_name(),vmSymbols::string_class_signature(),string,CHECK_(nh))
                                        ->AppClassLoader.loadClass
                                            ->java.net.URLClassLoader.findClass
                                                ->java.lang.ClassLoader.defineClass1
                                                    ->lang/ClassLoader.c#Java_java_lang_ClassLoader_defineClass1
                                                        ->prims/jvm.cpp#jvm_define_class_common
                                                            ->classfile/systemDictionary.cpp#SystemDictionary::resolve_from_stream
                                                                ->classfile/classFileParser.cpp#ClassFileParser::parseClassFile[GOTO://<classFileParser.cpp#ClassFileParser::parseClassFile类字节码静态解析>]
                                                                ->classfile/systemDictionary.cpp#SystemDictionary::define_instance_class//Add class just loaded
                                                                    ->add_to_hierarchy(k, CHECK);//根据R大的说法好像基于此数据结构涉及了个算法加速查找类啥的?具体细节忘了
                                                                    ->SystemDictionary::update_dictionary
                                                                    ->instanceKlass->eager_initialize
                                                                        ->oops/instanceKlass.cpp#instanceKlass::link_class_impl
                                                                            ->link_class_impl(super, throw_verifyerror, CHECK_false);//link super class before linking this class
                                                                            ->link_class_impl(interfaces->obj_at(index), throw_verifyerror, CHECK_false);// link all interfaces implemented by this class before linking this class
                                                                            ->instanceKlass.cpp#instanceKlass::verify_code[TODO://]
                                                                            ->instanceKlass.cpp#instanceKlass::rewrite_class[TODO://]
                                                                            ->instanceKlass.cpp#instanceKlass::relocate_and_link_methods
                                                                                ->interpreter/rewriter.cpp#Rewriter::relocate_and_link[TODO://]
                                                                            ->this_oop->vtable()->initialize_vtable
                                                                                ->oops/klassVtable.cpp#klassVtable::initialize_vtable[TODO://]
                                                                                    ->put_method_at(mh(), initialized);
                                                                                    ->mh()->set_vtable_index(initialized);
                                                                                    ->fill_in_mirandas(initialized);
                                                                                    ->klassVtable::put_method_at
                                                                            ->this_oop->itable()->initialize_itable
                                                                                ->oops/klassVtable.cpp#klassItable::initialize_itable[TODO://]
                                                                                    ->itableOffsetEntry::method_entry(_klass(), method_table_offset)[ime_num].initialize(target_h());
                                                                            ->this_oop->set_init_state(linked);//link完成 unparsable_by_gc、allocated、loaded、linked、being_initialized、fully_initialized、initialization_error
                        ->this_oop->resolved_klass_at(which);
                ->method_name=pool->name_ref_at(index);
                ->method_signature=pool->signature_ref_at(index);
            ->LinkResolver::resolve_static_call //resolve 方法
                ->linktime_resolve_static_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, CHECK);
                    ->interpreter/linkResolver.cpp#LinkResolver::resolve_method
                        ->LinkResolver::lookup_method_in_klasses //lookup method in resolved klass and its super klasses
                            ->oops/instanceKlass.cpp#instanceKlass::uncached_lookup_method
                                ->instanceKlass::cast(klass)->find_method(name, signature)
                                ->method == null -> klass = instanceKlass::cast(klass)->super();
                        ->oops/instanceKlass.cpp#instanceKlass::lookup_method_in_all_interfaces //lookup method in all the interfaces implemented by the resolved klass
                            ->as_klassOop())->transitive_interfaces().map{_.lookup_method(name, signature);}//循环实现接口的方法
                        ->access checks, access checking may be turned off when calling from within the VM.
                ->resolved_klass->initialize(CHECK);// (link -> fully_initialized)
                    ->oops/instanceKlass.cpp#instanceKlass::initialize -> instanceKlass::initialize_impl
                        ->this_oop->is_initialized()?wait
                        ->this_oop->set_init_state(being_initialized);
                        ->super_klass->initialize()
                        ->instanceKlass::call_class_initializer
                            ->JavaCalls::call(&result, <clinit>, &args, CHECK);//初始化static类
                        ->this_oop->set_initialization_state_and_notify(fully_initialized, CHECK);
        ->resolve_invokevirtual->LinkResolver::resolve_invokevirtual
            ->LinkResolver::resolve_pool
            ->LinkResolver::resolve_virtual_call
                ->LinkResolver::linktime_resolve_virtual_method
                    ->LinkResolver::resolve_method //同上
                ->LinkResolver::runtime_resolve_virtual_method
                    ->selected_method=instanceKlass->method_at_vtable(LinkResolver::vtable_index_of_miranda_method(..)) //miranda method
                        ->oops/klassVtable.cpp#klassVtable::index_of_miranda
                    ->selected_method=instanceKlass->method_at_vtable(resolved_method->vtable_index())
        ->resolve_invokeinterface->LinkResolver::resolve_invokeinterface[TODO://]
            ->LinkResolver::resolve_pool
            ->LinkResolver::resolve_interface_call
                ->LinkResolver::linktime_resolve_interface_method//查找虚函数表,将method_name, method_signature变为resolved_method
                    ->LinkResolver::resolve_interface_method
                        ->LinkResolver::lookup_instance_method_in_klasses// lookup method in this interface or its super, java.lang.Object
                        ->LinkResolver::lookup_method_in_interfaces // lookup method in all the super-interfaces
                        [TODO://...]
                ->LinkResolver::runtime_resolve_interface_method
                    ->LinkResolver::lookup_instance_method_in_klasses//查找真正实现此接口的实例
    
    1.4 cppInterpreter_zero执行引擎流程
    cppInterpreter_zero.cpp#CppInterpreter::normal_entry
        ->InterpreterFrame *frame = [BytecodeInterpreter::method_entry>]InterpreterFrame::build(method, CHECK_0)(设置InterpreterFrame,之前的是EntryFrame,EntryFrame是为了对接Interpreter::${MethodKind}_entry)
        ->thread->push_zero_frame(frame);
        ->cppInterpreter_zero.cpp#CppInterpreter::main_loop
            -while (true) {
                ->thread->set_last_Java_frame()
                ->bytecodeInterpreter.cpp#BytecodeInterpreter::run(istate);
                    ->case method_entry: ->goto run
                        ->opcode = *pc;
                        ->switch (opcode)
                            ->CASE(_new)
                                ->method()->constants().slot_at(index).get_oop()->klass_part()
                                ->UseTLAB->THREAD->tlab().allocate(obj_size);
                                ->Atomic::cmpxchg_ptr(new_top, Universe::heap()->top_addr(), compare_to)(指针碰撞在eden区分配)
                                    ->UseBiasedLocking->result->set_mark(如果启用偏向锁,则设置markword)
                                ->Slow case allocation:InterpreterRuntime::_new
                                    ->instanceKlass.cpp#instanceKlass::allocate_instance
                                        ->instanceKlass.cpp#CollectedHeap::obj_allocate
                                            ->CollectedHeap::obj_allocate[TODO://<instance初始化>:]
                            ->CASE(_invokevirtual || _invokespecial || _invokestatic)
                                ->InterpreterRuntime::resolve_invoke
                                    ->thread->last_frame().interpreter_callee_receiver(signature)//首先基于Interpreter上的bcp找到获取到bci,然后基于bic就能获取到被调用者的signature,然后基于栈顶缓存获取receiver对象,即extract receiver
                                    ->interpreter/linkResolver.cpp#LinkResolver::resolve_invoke//caller constantPool method resolve[TODO://方法内用到的method使用此种方式加载]
                                    ->cache_entry(thread)->set_method(bytecode,info.resolved_method(),info.vtable_index())
                                ->istate->set_msg(call_method);
                                ->callee = (methodOop) rcvrKlass->start_of_vtable()[ cache->f2()];//取出receiver instanceKlass的虚函数表相应位置的callee methodOop;
                                ->istate->set_callee(callee);
                                ->istate->set_callee_entry_point(callee->from_interpreted_entry());
                                ->istate->set_bcp_advance(3);
                                ->UPDATE_PC_AND_RETURN
                            ->CASE(_invokeinterface)
                                ->InterpreterRuntime::resolve_invoke//接口时
                                    ->thread->last_frame().interpreter_callee_receiver(signature)//同上_invokevirtual
                                    ->interpreter/linkResolver.cpp#LinkResolver::resolve_invoke
                                    ->int index = klassItable::compute_itable_index(info.resolved_method()());//设置缓存itable的index
                                        ->klassItable::compute_itable_index
                                            ->instanceKlass::cast(intf)->methods()//计算method归属接口类的index[TODO://interface]
    
                                    ->cache_entry(thread)->set_interface_call(info.resolved_method(), index);
                                ->istate->set_msg(call_method);
                                ->instanceKlass->start_of_itable()->interface_klass()//查找当前方法归属接口类
                                ->instanceKlass->start_of_itable().first_method_entry(rcvr->klass()).[cache->f2()].method();
                            ->CASE(_return)->handle_return
                                ->Check all the monitors(暂时pass)
                                ->istate->set_msg(return_from_method);
                                ->istate->set_return_kind((Bytecodes::Code)opcode);
                            ->CASE(_athrow)(抛异常会降低性能?具体影响程度感兴趣的时候再读)
                ->if istate->msg() == BytecodeInterpreter::call_method
                    ->methodOop callee = istate->callee();
                    ->Interpreter::invoke_method(callee, istate->callee_entry_point(), THREAD);
                        ->CppInterpreter::normal_entry(重新回到解释器入口函数,构建新的frame,并依次执行方法内bytecode)
                            ->InterpreterFrame *frame = [BytecodeInterpreter::method_entry>]InterpreterFrame::build(method, CHECK_0)
                            ->thread->push_zero_frame(frame);
                            ->cppInterpreter_zero.cpp#CppInterpreter::main_loop
                    ->istate->set_msg(BytecodeInterpreter::method_resume);
                ->if istate->msg() == BytecodeInterpreter::return_from_method
                    ->Copy the result into the caller's frame
                    ->跳出循环break;[GOTO:Break]
            ->//end while (true)
            ->[Break]thread->pop_zero_frame(); 
            ->stack->push(res);//结果写到栈帧上
    

    简写注释:
    bci(bytecode_index),index指在常量池中的索引
    bcp(bytecode_pointer:instruction pointer)

    二.reference

    五一假期3天时间review了一下OpenJDK1.6 执行引擎的代码,之前定的目标,目前来看只实现了前3个,由于汇编、操作系统、硬件指令集基础太差,Interpreter主要看的zero来替代TemplateInterpreter来串联思路,gc、jit目前暂时不看了:gc后续再看了,这个还是要搞明白的,JIT这个难度太大了,无限期延后了。


    三.下篇

    APACHE YARN 2.6.0 CODE REVIEW

    相关文章

      网友评论

        本文标题:HOTSPOT JVM 1.6 CODE REVIEW

        本文链接:https://www.haomeiwen.com/subject/npporftx.html