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

我在运行时检查一个文件用于各种目的.我正在使用jvmti代理.调用方法的策略是调用RetransformClasses函数调用ClassFileLoadHook.这种策略适用于所有在调试时间之后进行任何进一步调用方法,因为实际的测试发生在后续的函数调用中,但是对于没有进一步调用方法(如程序中的主要功能)不起作用.

我想在执行过程中即时运行一种方法.我想要一些程序,如检测代码的堆栈替换(OSR).在jvmti还是其他方法中有没有可用的策略?

PS:我可以编辑/修补OpenJDK的源代码,如果可以帮助的话.

解决方法

经过进一步的思考,我相信你是要求可能(也许!)在技术上可能的东西;但需要大量的努力;但在概念上它不是一个好办法.

我假设您的要求实际上是要对您抛出的任何类型的应用程序进行调整,以通过执行“覆盖并行化”来提高其性能.

所以,我没有一个真正的解决方案,我主要有一个关注的列表:

>首先,如果你甚至想要修改已经被触发并且当前执行的方法,那么你不仅仅是在谈论检测.您实际想要做的是提供自己的“JIT”机制 – 而JVM JIT也在那里,并且做它的工作.
所以,如果你真的很认真并且想要确保即使任何main()中的东西都可以从优化中受益 – 那么我认为,从概念上讲,你最好设计和实现自己的JVM.
>然后我想知道:你说要覆盖已经运行“long time loop”的main()方法.这听起来像是打算通过将您的仪器放在其上来修复坏的设计.我认为更合理的方法是:研究这些应用程序,并改进他们的设计.
>在这个意义上:如果“并行化”任意应用程序将是“那么容易” – 它将成为JVM的一部分.而事实并非如此;并且JVM不做这样的优化是一个很好的理由:这可能是很难得到正确和健壮的.

换句话说:我猜你有一个XY问题;而X的问题是您正在处理的应用程序可能会受益于“并行化”.但这是“一般”很难做的事情.

在这个意义上我宁愿定义一些类型的架构(可能包括应用程序如何“启动”的具体明确定义的步骤;以便您的工具可以成功地完成其工作),并首先获得该方法的经验.意思:告诉你的人不要把“长跑循环”放在他们的主()中(如上所述,那听起来像我这样很糟糕的设计).

相关文章

jinfo 命令可以用来查看 Java 进程运行的 JVM 参数,命令如下...
原文链接:https://www.cnblogs.com/niejunlei/p/5987611.ht...
java 语言, 开发者不能直接控制程序运行内存, 对象的创建都是...
jvm
1.jvm的简单抽象模型:  2.类加载机制     双亲委派模...
堆外内存JVM启动时分配的内存,称为堆内存,与之相对的,在代...
1.springboot和tomcat2.springcloud的请求如何通过网关鉴权?...