模块 jdk.dynalink

类 ChainedCallSite

所有已实现的接口:
RelinkableCallSite

public class ChainedCallSite extends AbstractRelinkableCallSite
实现多态内联缓存策略的可重新链接的调用站点。它最多能记住 8 个与它链接的 GuardedInvocation ,并且在每个重新链接请求上构建一个级联的方法句柄链,一个调用回落到下一个调用。可以通过覆盖子类中的 getMaxChainLength() 来自定义记住的调用次数。当此调用站点与新调用重新链接并且链的长度已经达到最大值时,它将丢弃最旧的调用。带有无效切换点的调用和触发其无效异常的调用被急切地从链中删除。调用永远不会重新排序;最近链接的方法句柄总是在链的开头,最近最少链接的在它的末尾。可以同时在多个线程上安全地重新链接调用站点。链接中的竞争条件通过丢弃在丢失线程上生成的 GuardedInvocation 而不将其合并到链中来解决,因此它可能导致对相同参数的重复链接。
  • 构造方法详细信息

    • ChainedCallSite

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

    • 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 复制的描述
      每次重新链接调用站点时,动态链接器都会调用此方法and链接器希望调用站点丢弃任何先前的链接状态(这就是它与 RelinkableCallSite.relink(GuardedInvocation, MethodHandle) 的不同之处)。它将传递一个 GuardedInvocation,调用站点应该使用它来构建其新的目标方法句柄。调用此方法时,不鼓励调用站点保留任何先前的状态,并且应该只链接当前调用。
      参数:
      guardedInvocation - 调用站点应该用来构建其目标方法句柄的受保护调用。
      relinkAndInvoke - 重新链接和调用方法句柄。这是一个方法句柄,与 DynamicLinker 作为回调提供的调用站点的方法类型相匹配。当它不能用传递的参数调用它的目标时,它应该被这个调用站点用作最终的回退。回退方法是这样的,当它被调用时,它会尝试为调用获取足够的目标 GuardedInvocation ,然后调用 RelinkableCallSite.relink(GuardedInvocation, MethodHandle) RelinkableCallSite.resetAndRelink(GuardedInvocation, MethodHandle) ,最后调用目标。