2010-01-25 81 views
12

我有一个当前在windows shell下运行的java进程。在现有的jvm进程中执行新的java代码

一个负责串行化的线程被无限期阻塞,作为被存储在存储器中的结果的重要信息不再被写入磁盘。

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

这将是方便,如果我可以编写和编译了一些新的代码,并且它在相同的存储空间内执行,以使上述信息可以更之前,我关闭过程中,一旦序列化。

该工艺使用java -jar命令启动。

随着HotSpot虚拟机的功能,有没有什么办法来实现这一目标?

+0

你可以附加一个调试器的过程?如果是这样,那么你可能会触发代码来保存数据。 – jdigital 2010-01-25 05:29:13

+0

我在过去曾经使用过btrace的情况。 http://kenai.com/projects/btrace/pages/Home – 2010-01-25 05:34:37

+0

你应该说你正在使用什么版本的JVM。 – 2010-01-25 05:44:05

回答

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); 

当代理是您的罐子的名称。

剂罐含有Agent,其可以与使用仪器API的JVM接口。

创建,使程序在运行时加载的代理,你实现一个agentmain功能是这样的:

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

public static void agentmain(String agentArgs); 

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

祝你好运!

+0

谢谢,这可能是最好的选择,但是我怀疑我能够做到我想要的 - 这是有人在对象字段(没有静态引用)上获得句柄并将其序列化。尽管我会尽我所能(最糟糕的)! – pstanton 2010-01-25 08:00:44

+0

实际上,我*可以通过在特定线程上抛出异常来解决我的问题。此线程无限期地挂在套接字上。我知道如何获得线程的句柄,并且需要在其中引发异常,或者我可以终止并重新启动它。会尝试。谢谢。 – pstanton 2010-01-25 08:07:07

+0

你可以试着打断它。 – 2010-01-25 09:25:43

相关问题