在Java中调用方法时,什么是“调用现场”?

4
我正在尝试理解JVM中的调用站点(call site)是什么。引用自https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-5.html#jvms-5.4.3.6
调用站点指示符分辨率(call site specifier resolution)的结果是一个元组,包括: • 对java.lang.invoke.MethodHandle实例的引用, • 对java.lang.invoke.MethodType实例的引用, • 对Class、java.lang.invoke.MethodHandle、java.lang.invoke.MethodType和String实例的引用。
我们还有所谓的调用站点对象https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-6.html#jvms-6.5.invokedynamic
引导方法返回的结果必须是对一个其类为java.lang.invoke.CallSite或者java.lang.invoke.CallSite子类的对象的引用。这个对象被称为调用站点对象。
调用站点对象的概念很清楚,这只是CallSite的一个实例。但是调用站点指示符呢?它是一个Java对象吗?它是一个String文字吗?
1个回答

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

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

    // 来自java.lang.invoke package description

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

    没有指定这个项目的真实内容。
    JVMS只告诉我们,在常量池中,符号引用到调用点规范看起来像什么

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接