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

Saq*_*med 9 java instrumentation jit jvm-hotspot jvmti

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

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

PS:如果能有所帮助,我愿意编辑/修补OpenJDK源代码.

Gho*_*ica 2

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

假设您的要求实际上是您想要检测向您抛出的任何类型的应用程序,以便通过“幕后并行化”来提高其性能。

因此,我主要有一系列的担忧,而不是真正的解决方案:

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

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

从这个意义上说;我宁愿定义某种架构(可能包括应用程序应如何“启动”的特定的、定义明确的步骤;以便您的仪器可以成功地完成其工作)并首先获得该方法的经验。意思是:告诉你的人一开始就不要将“长时间运行的循环”放入他们的main()程序中(如上所述;对我来说,这听起来像是非常糟糕的设计!)。