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

时间:2017-01-23 08:06:36

标签: java jit instrumentation jvm-hotspot jvmti

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

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

PS:我打开编辑/修补OpenJDK源代码,如果可以帮助的话。

1 个答案:

答案 0 :(得分:2)

经过深思熟虑之后,我相信你要求的东西可能(也许!)在技术上是可能的;但需要付出很多努力;但从概念上来说这不是一个好方法。

假设您的要求实际上是您希望检测任何类型的应用程序,以便通过“在封面并行化下”来提高其性能。

所以,我没有真正的解决方案,而是主要关注一系列问题:

  • 首先,如果您甚至想要修改已经触发并且当前执行的方法,那么您不仅要讨论检测。你真正想做的是提供你自己的“JIT”机制 - 而JVM JIT也在那里,并且正在完成它的工作。
  • 所以,如果你真的认真对待这件事;并且希望确保即使任何main()中的内容都可以从您的优化中受益 - 然后我认为,从概念上讲,您最好设计和实现自己的 JVM。
  • 然后我想知道:你说要覆盖已经运行“长时间循环”的main()方法。听起来你打算通过抛弃你的仪器来修复糟糕的设计。我认为更合理的方法是:研究这些应用程序,并改进他们的设计。
  • 从某种意义上讲:如果“并行化”任意应用程序将是“那么容易” - 它无论如何都将成为JVM的一部分。而事实并非如此;并且JVM没有做这种优化是有充分理由的:它可能超级硬来获得正确和强大的功能。

换句话说:我猜测你有XY问题; X问题是您正在处理的应用程序可以从“并行化”中受益。但这是“一般”很难做到的事情。

从这个意义上说;我宁愿定义某种架构(可能包括应用程序应该“启动”的具体,明确定义的步骤;以便您的仪器可以成功地完成其工作)并首先获得该方法的经验。含义:告诉你的伙伴们不要在他们的main()中放入“长跑圈”(如上所述;对我来说,这对我来说听起来非常糟糕!)。