在现有 jvm 进程中执行新的 java 代码

2022-09-04 03:39:38

我有一个Java进程,目前在Windows shell下运行。

负责序列化的线程之一被无限期阻止,因此存储在内存中的重要信息不再写入磁盘。

如果我关闭进程,信息将丢失。

如果我可以编写和编译一些新代码,并让它在同一内存空间中执行,以便在我关闭进程之前可以再次序列化所述信息,那将很方便。

该过程是使用命令启动的。java -jar

借助热点 VM 功能,有没有办法实现这一点?


答案 1

可以使用附加 API 附加到虚拟机。这是一篇解释如何使用它的文章

下面是一个代码示例:

String agentJAR = "myAgent.jar";
VirtualMachine vm = VirtualMachine.attach (processid);
vm.loadAgent(agentJAR);

其中代理是罐子的名称。

代理 jar 包含一个代理,它可以使用工具 API 与 JVM 接口。

要创建在运行时加载的代理,请实现如下函数:agentmain

public static void agentmain(String agentArgs, Instrumentation inst); 

public static void agentmain(String agentArgs); 

Instrumentation 对象用于在运行时修改类,您可能不需要这些类。但希望你可以把你需要运行的任何代码放在agentmain中,然后使用附加API在目标JVM中运行它。

祝你好运!!


答案 2

您可以尝试注册信号处理程序,这在Windows上比其他平台上受到的限制更多。

示例和说明 http://www.ibm.com/developerworks/java/library/i-signalhandling/

但要问的问题是,为什么线程被阻塞了?


推荐