调用方法时Java中的call site是什么?

What is call site in Java when calling method?

我想了解什么是 JVM 中的调用站点。引自 https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-5.html#jvms-5.4.3.6

The result of call site specifier resolution is a tuple consisting of:

• the reference to an instance of java.lang.invoke.MethodHandle,

• the reference to an instance of java.lang.invoke.MethodType,

• the references to instances of Class, java.lang.invoke.MethodHandle, java.lang.invoke.MethodType, and String.

我们还有所谓的调用站点对象https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-6.html#jvms-6.5.invokedynamic:

The result returned by the bootstrap method must be a reference to an object whose class is java.lang.invoke.CallSite or a subclass of java.lang.invoke.CallSite. This object is known as the call site object

调用站点对象概念清晰。这只是 CallSite 的一个实例。但是调用站点说明符呢?那是一个 Java 对象吗?那是 String 文字吗?

  • 动态调用站点是一个每次出现的invokedynamic指令。

    Before the JVM can execute a dynamic call site (an invokedynamic instruction), the call site must first be linked. Linking is accomplished by calling a bootstrap method which is given the static information content of the call site, and which must produce a method handle that gives the behavior of the call site.

    // from java.lang.invoke package description

  • Call site specifier是一个描述如何link[=36的项目(从常量池中获得) =] 给定的调用站点。

    未指定此项目的真实含义。
    JVMS 只告诉常量池中的symbolic reference to the call site specifier looks like如何。

    JVM 实现可以自由选择调用站点说明符的内部表示。它可以是堆中的一个对象,也可以是本机内存中的一段元数据。例如,HotSpot JVM 将调用站点说明符缓存为 object array,其中第一个元素是 MethodHandle 的实例,表示 bootstrap 方法,其余元素是调用此 bootstrap方法。

    无论 JVM 内部如何实现调用站点说明符,当它被解析时,它应该产生一个永久绑定到动态调用站点的调用站点对象(java.lang.invoke.CallSite 的实例)。