如何使用没有进一步调用的 JVMTI 代理重新转换执行方法?

How to retransform an executing method with JVMTI agent which has no further invocations?

我出于各种目的在运行时检测一个 class 文件。为此,我正在使用 JVMTI 代理。我检测方法的策略是调用 RetransformClasses 函数来调用 ClassFileLoadHook。此策略适用于所有在检测时间后有任何进一步调用的方法,因为实际检测发生在后续函数调用时,但它不适用于任何没有进一步调用的方法,如 main 中的函数一个程序。

我想在执行过程中即时检测方法。我想要一些程序,例如检测代码的堆栈替换 (OSR)。 JVMTI 或任何其他方法中是否有可用的策略????

PS:如果有帮助,我愿意阅读 editing/patching OpenJDK 源代码。

经过进一步思考,我相信您要求的东西在技术上可能(也许!)是可行的;但需要很多努力;但概念上这不是一个好方法。

假设你的要求实际上是你想检测任何抛给你的应用程序,以提高其性能做 "under the cover parallelizing".

所以,我没有真正的解决方案,主要有一个问题列表:

  • 首先,如果您甚至想修改已经触发和当前 执行的方法,那么您不仅仅是在谈论检测。你真正想要做的是提供你自己的 "JIT" 机制——同时 JVM JIT 也在那里,并在做它的工作。
  • 所以,如果你真的认真对待这件事;并希望确保甚至任何 main() 中的东西都可以从您的优化中受益 - 那么我认为,从概念上讲,您最好设计和实现自己的 JVM。
  • 然后我想知道:你说要涵盖 main() 已经是 运行 "long time loops" 的方法。听起来您打算通过使用仪器来修复不良设计。我认为更明智的方法是:研究此类应用程序,并改进它们的设计。
  • 在某种意义上:如果 "parallelizing" 任意应用程序将是 "that easy" - 它无论如何都会成为 JVM 的一部分。而事实并非如此;并且 JVM 不进行此类优化是有充分理由的:可能 超级难 获得正确和健壮的。

换句话说:我你有XY问题; X 问题是您正在处理的应用程序可以从 "parallelizing" 中受益。但这是很难做到的事情 "in general".

从这个意义上说;我宁愿定义某种架构(可能包括特定的 well-defined 应用程序应如何 "start up" 的步骤;以便您的仪器可以成功地完成其工作)并首先获得该方法的经验。意思是:一开始就告诉你的人不要把 "long running loops" 放到他们的 main() 中(如前所述;对我来说,这本身就是一个非常糟糕的设计!)。