准备工作

调用栈

先在 JavaMain 函数(参考 OpenJDK9 Hotpot java 虚拟机入口)中 CallStaticVoidMethod 设断点,然后在 CppInterpreter_zero.cpp 的 normal_entry 方法中设置断点:

图片描述

CppInterpreter::normal_entry

通过 THREAD 宏获取当前 thread,然后创建第 0 个栈帧,然后进入 main loop 解释执行 字节码

int CppInterpreter::normal_entry(Method* method, intptr_t UNUSED, TRAPS) {
    JavaThread *thread = (JavaThread*) THREAD;

    // Allocate and initialize our frame.
    InterpreterFrame *frame = InterpreterFrame::build(method, CHECK_0);
    thread->push_zero_frame(frame);

    // Execute those bytecodes!
    main_loop(0, THREAD);

    // No deoptimized frames on the stack
    return 0;
}

CppInterpreter::main_loop

void CppInterpreter::main_loop(int recurse, TRAPS) {
   ...
   while (true) {
       if (JvmtiExport::can_post_interpreter_events()) {
           BytecodeInterpreter::runWithChecks(istate);
       } else {
           BytecodeInterpreter::run(istate);
       }
   }
}

xingpingz
122 声望64 粉丝

博学,审问,慎思,明辨,力行