4

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

调用站点说明符解析的结果是一个元组,包括:

• 对 的实例的引用java.lang.invoke.MethodHandle

• 对 的实例的引用java.lang.invoke.MethodType

Class• 对、java.lang.invoke.MethodHandlejava.lang.invoke.MethodType和的实例的引用String

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

bootstrap 方法返回的结果必须是对类为 的对象java.lang.invoke.CallSite或其子类 的引用java.lang.invoke.CallSite。此对象称为调用站点对象

调用站点对象的概念很明确。这只是CallSite. 但是调用站点说明符呢?那是一个Java对象吗?那是String字面意思吗?

4

1 回答 1

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

    在 JVM 可以执行动态调用站点(一条invokedynamic 指令)之前,必须先链接调用站点。链接是通过调用一个引导方法来完成的,该方法给出了调用站点的静态信息内容,并且必须产生一个给出调用站点行为的方法句柄。

    // 来自java.lang.invoke 包描述

  • 调用站点说明符是一个项目(从常量池中获得),它描述了如何链接给定的调用站点。

    没有具体说明这个项目到底是什么。
    JVMS 仅说明对调用站点说明符的符号引用在常量池中的样子

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

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

于 2018-03-21T22:04:59.367 回答