出于各种目的,我在运行时检测类文件。为此,我正在使用 JVMTI 代理。我检测方法的策略是调用 RetransformClasses
函数来调用 ClassFileLoadHook
。此策略适用于所有在检测后有任何进一步调用的方法,因为实际检测发生在后续函数调用时,但它不适用于任何没有进一步调用的方法,如 main
在程序中运行。
我想在执行过程中即时检测方法。我想要一些程序,例如检测代码的堆栈替换 (OSR)。 JVMTI 或任何其他方法中是否有可用的策略????
PS:如果有帮助,我愿意编辑/修补 OpenJDK 源代码。
最佳答案
经过进一步思考,我相信您要求的东西在技术上可能(也许!)是可行的;但需要很多努力;但概念上这不是一个好方法。
我假定您的需求实际上是您想要对抛给您的任何应用程序进行检测,以便通过“隐藏并行化”来提高其性能。
所以,我没有真正的解决方案,主要有一个问题列表:
- 首先,如果您甚至想修改已经触发和当前 执行的方法,那么您不仅仅是在谈论检测。您真正想要做的是提供您自己的“JIT”机制——同时 JVM JIT 也在那里,并发挥其作用。
- 所以,如果你真的认真对待这件事;并希望确保即使是任何
main()
中的内容都可以从您的优化中受益 - 那么我认为,从概念上讲,您最好设计和实现您的自己的 JVM然后。 - 然后我想知道:您说要涵盖已经在运行“长时间循环”的
main()
方法。这听起来像是您打算通过使用仪器来修复糟糕的设计。我认为更明智的方法是:研究此类应用程序,并改进它们的设计。 - 在某种意义上:如果“并行化”任意应用程序“那么简单”——它无论如何都会成为 JVM 的一部分。而事实并非如此;并且 JVM 不进行此类优化是有充分理由的:要获得正确和健壮的优化可能 super 困难。
换句话说:我猜想你有一个 XY 问题; X 问题是您正在处理的应用程序可以从“并行化”中受益。但这是“一般情况下”很难做到的事情。
从这个意义上说;我宁愿定义某种架构(可能包括特定的、定义明确的步骤,应用程序应该如何“启动”;以便您的仪器可以成功地完成它的工作)并首先获得使用该方法的经验。意思是:一开始就告诉你的人不要将“长时间运行的循环”放入他们的 main()
中(如前所述;对我来说,这本身就是一个非常糟糕的设计!)。
关于java - 如何使用没有进一步调用的 JVMTI 代理重新转换执行方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41801634/