【问题标题】:How to retransform an executing method with JVMTI agent which has no further invocations?如何使用没有进一步调用的 JVMTI 代理重新转换执行方法?
【发布时间】:2023-08-01 18:24:01
【问题描述】:

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

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

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

【问题讨论】:

  • 我不明白的是:考虑到这样的方法将永远被调用;检测它有什么意义?我的意思是:当稍后调用该方法时,仪器不是为您提供“洞察力”吗?比如调用方法的时候?
  • 分析仪器而言,您是正确的。我正在检测我的代码以在方法中并行化长时间运行的循环。因此,如果您的main 中有一个繁琐的循环,我想对其进行检测以生成一些线程并加入它们(如果它是可并行化的当然)。这就是为什么我遇到了检测单个调用函数的原因。
  • 你看过javaagent吗?
  • @DennisC 是的。我从 Javaagent 开始。我试过 ASM 和 Javassist。 Javagent 在其后端也使用相同的策略。对于动态运行时检测,它会做同样的事情。也就是说,如果有任何后续调用,则检测后续调用。
  • 顺便说一句。不要太相信 OSR。每次发布新的 jdk 时,我阅读 lucene 项目通常都会发现由于 OSR 和优化器导致的热点中的一些错误。

标签: java jit instrumentation jvm-hotspot jvmti


【解决方案1】:

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

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

所以,我主要有一个问题清单,而不是真正的解决方案:

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

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

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

【讨论】:

  • 你或多或少得到了它。我主要关心的是利用 java 代码中的隐式并行性,假设我没有应用程序的 java 源。就分析而言,我分析了字节码的可并行性,并且效果很好。显然这真的很难分析,但这不是我主要关心的问题。我只是关心即时重新定义我的课程。我已经在类加载时间对我的类进行了检测,并且我得到了我想要的结果。现在我想使用 JIT 分析器为我筛选一些热点并仅并行化那些。
  • 使用热点的原因也很明显。公理是:“每个循环都不值得并行化。只有热点才值得。”牢记这一点,我自然倾向于在代码中检测执行热点。还有运行时动态检测。
  • 我分析了字节码的可并行性,并且效果很好 ...是一个非常大胆的声明 ;-) ...我想知道你发现了无数人在做什么迄今为止,该领域的研究被忽视了。
  • 是的。对不起,给人的印象是。 :-) 我的意思是我的系统到目前为止工作正常,我有一个端到端的原型。我并不是说我找到了一些分析并行性的新方法。我发现了一个叫做JAVAB的东西。这是一个字节码并行化工具。
  • 仍然……听起来很有趣。这会在某个时候开源吗?在任何情况下;我曾希望我的第一次赏金胜利,但到目前为止,答案似乎甚至不值得为路过的人投票……但我会继续思考;也许我以后会有一些更有用的内容。