我在运行时出于各种目的检测类文件。为此,我使用了 JVMTI 代理。我检测方法的策略是调用RetransformClasses
要调用的函数ClassFileLoadHook
。此策略适用于在检测后进行任何进一步调用的所有方法,因为实际检测发生在后续函数调用时,但它不适用于任何没有进一步调用的方法,例如main
程序中的函数。
我想在执行过程中动态检测方法。我想要一些程序,例如检测代码的堆栈替换(OSR)。 JVMTI 或任何其他方法中是否有可用的策略???
PS:如果有帮助的话,我愿意编辑/修补 OpenJDK 源代码。
经过进一步的思考,我believe你所要求的东西在技术上可能(也许!)是可能的;但需要付出很多努力;但概念上这不是一个好方法。
I assume你的要求实际上是你想要仪器any一种向您抛出的应用程序,目的是通过“幕后并行化”来提高其性能。
因此,我主要有一系列的担忧,而不是真正的解决方案:
- 首先,如果您想修改已经触发的方法现在执行后,您不仅仅是在谈论仪器。你真正想要做的是提供你自己的“JIT”机制——而 JVM JIT 也在那里,并且在做它的工作。
- 所以,如果你真的认真对待这件事;并且想要确保即使是任何事情
main()
可以从你的优化中受益 - 那么我认为,从概念上讲,你最好设计和实现你的own然后是 JVM。
- 然后我就纳闷了:你说要盖
main()
已经运行“长时间循环”的方法。听起来你打算修复糟糕的设计把你的仪器扔给它。我认为更明智的方法是:研究此类应用程序,然后improve他们的设计。
- 从某种意义上说:如果“并行化”任意应用程序“那么容易”——无论如何它都会成为 JVM 的一部分。但事实并非如此; JVM 不进行此类优化是有充分理由的:它可能是超级难以获得正确和稳健的结果。
换句话说:我guess你有一个 XY 问题; X 问题是您正在处理的应用程序可以从“并行化”中受益。但这是“一般而言”很难做到的事情。
从这个意义上说;我宁愿定义某种架构(可能包括应用程序应如何“启动”的特定的、定义明确的步骤;以便您的仪器可以成功地完成其工作)并首先获得该方法的经验。含义:告诉你的人们不要将“长时间运行的循环”放入他们的main()
首先(如前所述;对我来说,仅此一点听起来就很糟糕!)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)