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

时间:2010-01-25 05:18:56

标签: java jvm-hotspot

我有一个当前在Windows shell下运行的java进程。

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

如果我关闭了该过程,信息将会丢失。

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

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

使用热点VM功能,有没有办法实现这一目标?

2 个答案:

答案 0 :(得分:12)

您可以使用Attach API附加到虚拟机。 Here's an article that explains how to use it

这是一个代码示例:

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

代理商是罐子的名称。

代理jar包含Agent,它可以使用Instrumentation API与JVM连接。

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

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

public static void agentmain(String agentArgs); 

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

祝你好运!!

答案 1 :(得分:0)

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

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

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