深入解析JVM之java方法调用入口entry_point的生成
2024-02-05 06:26:00
JVM中Java方法调用的流程概述
在JVM中,Java方法的调用是一个复杂的过程,涉及多个组件的协同工作。首先,当Java代码中调用一个方法时,Java虚拟机会将该方法的名称和参数信息传递给解释器。解释器会将这些信息转换为字节码指令,并将其存储在方法区中。
当需要执行一个Java方法时,JVM会将该方法的字节码指令加载到内存中,并将其传递给JIT编译器。JIT编译器会将字节码指令编译成机器码,并将其存储在代码缓存中。
当需要调用一个Java方法时,JVM会从代码缓存中找到该方法的机器码,并将其传递给CPU执行。CPU会根据机器码来执行Java方法,并返回执行结果。
JavaCalls::call方法的调用
在JVM中,Java方法的调用是由JavaCalls::call方法实现的。该方法位于hotspot/src/share/vm/prims/jvm.cpp文件中。JavaCalls::call方法的原型如下:
JNIEXPORT jint JNICALL JavaCalls::call(JavaCallWrapper* jcw, JNIEnv* env, jobject java_peer, jmethodID java_mid, jobjectArray java_args)
该方法的第一个参数jcw是一个JavaCallWrapper结构体的指针,其中包含了有关要调用的Java方法的信息。第二个参数env是一个JNIEnv结构体的指针,其中包含了有关当前线程的信息。第三个参数java_peer是一个jobject对象,代表了调用Java方法的Java对象。第四个参数java_mid是一个jmethodID对象,代表了要调用的Java方法。第五个参数java_args是一个jobjectArray对象,其中包含了传递给Java方法的参数。
JavaCalls::call方法首先会检查JavaCallWrapper结构体中的信息,以确定要调用的Java方法的名称、参数类型和返回值类型。然后,该方法会从Java虚拟机的内部数据结构中找到该Java方法的实现。最后,该方法会调用该Java方法的实现,并将执行结果返回给调用者。
call_helper和CallStub结构体的作用
在JavaCalls::call方法中,会调用call_helper和CallStub结构体来完成Java方法的调用。call_helper结构体位于hotspot/src/share/vm/interpreter/interpreter_intrinsics.hpp文件中,其原型如下:
struct call_helper {
CallStub* cb;
jmethodID mid;
jvalue* args;
jvalue result;
};
call_helper结构体包含了有关要调用的Java方法的信息,包括要调用的Java方法的实现(cb)、要调用的Java方法的ID(mid)、传递给Java方法的参数(args)和Java方法的返回值(result)。
CallStub结构体位于hotspot/src/share/vm/interpreter/interpreter_intrinsics.hpp文件中,其原型如下:
struct CallStub {
void* stub_code;
void (*invoke)(CallStub*, call_helper*);
};
CallStub结构体包含了有关Java方法调用的信息,包括Java方法调用的机器码(stub_code)和Java方法调用的实现(invoke)。
JavaCalls::call方法会首先创建一个call_helper结构体,并将有关要调用的Java方法的信息存储在其中。然后,该方法会创建一个CallStub结构体,并将有关Java方法调用的信息存储在其中。最后,该方法会调用CallStub结构体中的invoke方法,来执行Java方法的调用。
entry_pointJava方法的实现
在CallStub结构体中,invoke方法会调用entry_pointJava方法来执行Java方法的调用。entry_pointJava方法位于hotspot/src/share/vm/interpreter/interpreter_intrinsics.hpp文件中,其原型如下:
void entry_pointJava(CallStub*, call_helper*);
entry_pointJava方法的第一个参数是一个CallStub结构体的指针,其中包含了有关Java方法调用的信息。第二个参数是一个call_helper结构体的指针,其中包含了有关要调用的Java方法的信息。
entry_pointJava方法首先会将call_helper结构体中的参数传递给Java虚拟机的内部数据结构。然后,该方法会调用Java虚拟机的内部数据结构中的Java方法的实现,并将执行结果返回给调用者。