【问题标题】:When does Java read method bytecode?Java 什么时候读取方法字节码?
【发布时间】:2018-04-27 11:59:45
【问题描述】:

因此,在检测期间,我们注意到,当我们有一个方法 foo 并为其交换字节码时,只有新的调用才会对新的字节码进行操作,而交换不会影响该方法的已运行实例。

出于引用目的,是否在某处记录了该行为?

【问题讨论】:

  • 您能澄清一下“方法的实例”是什么意思吗?
  • “新调用”是什么意思?是existingInstance.foo() 还是new Instance().foo()
  • @Andrew 假设我调用一个方法myinstance.foo(),开始第一次运行(“实例”)A。现在我同时交换该方法的字节码并再次调用myinstance.foo(),开始运行/实例 B。B 将运行新的字节码,而 A 仍将运行旧的字节码,直到它返回......或者至少这是我们认为已经观察到的。

标签: java methods jvm bytecode instrumentation


【解决方案1】:

出于引用目的,是否在某处记录了该行为?

是的,是的。请参阅Instrumentation.redefineClasses 的 Javadoc:

如果重新定义的方法具有活动堆栈帧,则这些活动帧继续运行原始方法的字节码。重新定义的方法将用于新的调用。

【讨论】:

  • 完美,谢谢。我们正在使用ByteBuddy 注入我们的字节码,但我猜最终它必须通过检测 api。
【解决方案2】:

一个明显的不回答:最好是这样。

您会看到,代码正在运行时交换方法的代码很可能会导致不一致。

如果您的旧版本有 4 个指令(例如 4 个作业),但新版本有 3 个完全不同的作业怎么办。现在发生 4 个分配中的 2 个,然后交换代码。现在呢?

这种热插拔活动的整个想法是创建不一致的行为。您交换当前正在执行的代码的想法是快速准确解决不一致问题的好方法。

【讨论】:

  • 问题是在哪里可以找到解释行为的文档。
  • @GhostCat 您通常会提供多少个未回答的问题? :) 就像我从你那里遇到的 4/5-th - 我真的不在乎,只是想知道
  • @Eugene 只要我认为合适。那里有足够多的人试图准确地回答所问的问题,而不是考虑更大的图景。所以,我认为没有答案和“大局”是我的利基;-)
猜你喜欢
  • 1970-01-01
  • 2012-05-16
  • 2018-01-01
  • 2012-02-12
  • 1970-01-01
  • 1970-01-01
  • 2011-09-19
  • 2011-10-30
相关资源
最近更新 更多