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

标签 java jit instrumentation jvm-hotspot jvmti

出于各种目的,我在运行时检测类文件。为此,我正在使用 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/

相关文章:

java - Java线程执行单条指令是基于 native CPU还是字节码

Java:如何在 JVM 加载类时拦截它们

java - Java 7 try-with-resources 的 Clover 检测后编译失败

java - 如何抑制构造函数中的私有(private)方法调用?

c++ - 是否有即时编译的正则表达式引擎?

java - 测试 equals() 时解决 SonarQube 中的 "null comparison"错误

java - 识别 `` 方法代码太大``起源

java - 将值存储在 Java 集合中

java - 将一个单声道对象转换为两个不同的单声道对象,并且根单声道对象执行两次