Module jdk.dynalink

Class ChainedCallSite

所有已实现的接口:
RelinkableCallSite

public class ChainedCallSite extends AbstractRelinkableCallSite
实现多态内联缓存策略的可重链接调用站点。它记住了最多8个GuardedInvocation,并在每次重新链接请求时构建一个方法句柄级联链,其中一个调用会回退到下一个调用。可以通过在子类中覆盖getMaxChainLength()来自定义记忆的调用次数。当此调用站点与新调用重新链接且链的长度已达到最大值时,它将丢弃最旧的调用。已失效的开关点和由其失效的异常触发的调用会立即从链中移除。调用永远不会重新排序;最近链接的方法句柄始终位于链的开头,最近链接的方法句柄位于链的末尾。调用站点可以安全地在多个线程上同时重新链接。链接中的竞争条件通过丢弃在失败线程上生成的GuardedInvocation来解决,而不将其合并到链中,因此可能会导致对相同参数重复链接。
  • Constructor Details

    • ChainedCallSite

      public ChainedCallSite(CallSiteDescriptor descriptor)
      创建一个新的链式调用站点。
      参数:
      descriptor - 调用站点的描述符。
  • Method Details

    • getMaxChainLength

      protected int getMaxChainLength()
      链中方法句柄的最大数量。默认为8。如果需要更改该值,可以在子类中进行覆盖。
      返回:
      链中方法句柄的最大数量。检查返回值,如果您的覆盖返回值小于1,则会抛出一个RuntimeException
    • relink

      public void relink(GuardedInvocation guardedInvocation, MethodHandle relinkAndInvoke)
      从接口复制的描述: RelinkableCallSite
      每次重新链接调用站点时,动态链接器都会调用此方法(但请参阅RelinkableCallSite.resetAndRelink(GuardedInvocation, MethodHandle)以获取异常)。它将传递一个GuardedInvocation,调用站点应将其合并到其目标方法句柄中。调用此方法时,允许调用站点保留其他未失效的调用以实现多态内联缓存,并将它们与此调用组合以形成最终目标。
      参数:
      guardedInvocation - 调用站点应将其合并到其目标方法句柄中的受保护调用。
      relinkAndInvoke - 一个重新链接和调用方法句柄。这是一个与调用站点的方法类型匹配的方法句柄,由DynamicLinker作为回调提供。当调用此方法时,它应该作为无法使用传递的参数调用其目标时的最终回退使用。回退方法是这样的,当调用它时,它将尝试为调用获取一个足够的目标GuardedInvocation,然后调用RelinkableCallSite.relink(GuardedInvocation, MethodHandle)RelinkableCallSite.resetAndRelink(GuardedInvocation, MethodHandle),最后调用目标。
    • resetAndRelink

      public void resetAndRelink(GuardedInvocation guardedInvocation, MethodHandle relinkAndInvoke)
      从接口复制的描述: RelinkableCallSite
      每次重新链接调用站点时,动态链接器都会调用此方法,并且链接器希望调用站点丢弃任何先前的链接状态(这与RelinkableCallSite.relink(GuardedInvocation, MethodHandle)的区别)。它将传递一个GuardedInvocation,调用站点应使用它来构建其新的目标方法句柄。调用此方法时,不建议调用站点保留任何先前的状态,应该只链接当前调用。
      参数:
      guardedInvocation - 调用站点应使用它来构建其目标方法句柄的受保护调用。
      relinkAndInvoke - 一个重新链接和调用方法句柄。这是一个与调用站点的方法类型匹配的方法句柄,由DynamicLinker作为回调提供。当调用此方法时,它应该作为无法使用传递的参数调用其目标时的最终回退使用。回退方法是这样的,当调用它时,它将尝试为调用获取一个足够的目标GuardedInvocation,然后调用RelinkableCallSite.relink(GuardedInvocation, MethodHandle)RelinkableCallSite.resetAndRelink(GuardedInvocation, MethodHandle),最后调用目标。