返回

深入解析JVM之java方法调用入口entry_point的生成

后端

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方法的实现,并将执行结果返回给调用者。