我有一个当前在windows shell下运行的java进程。在现有的jvm进程中执行新的java代码
一个负责串行化的线程被无限期阻塞,作为被存储在存储器中的结果的重要信息不再被写入磁盘。
如果我关闭了进程,信息将会丢失。
这将是方便,如果我可以编写和编译了一些新的代码,并且它在相同的存储空间内执行,以使上述信息可以更之前,我关闭过程中,一旦序列化。
该工艺使用java -jar
命令启动。
随着HotSpot虚拟机的功能,有没有什么办法来实现这一目标?
我有一个当前在windows shell下运行的java进程。在现有的jvm进程中执行新的java代码
一个负责串行化的线程被无限期阻塞,作为被存储在存储器中的结果的重要信息不再被写入磁盘。
如果我关闭了进程,信息将会丢失。
这将是方便,如果我可以编写和编译了一些新的代码,并且它在相同的存储空间内执行,以使上述信息可以更之前,我关闭过程中,一旦序列化。
该工艺使用java -jar
命令启动。
随着HotSpot虚拟机的功能,有没有什么办法来实现这一目标?
可以使用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中运行它。
祝你好运!
您可能会尝试注册信号处理程序,这在Windows上比在其他平台上更受限制。
例子和说明 http://www.ibm.com/developerworks/java/library/i-signalhandling/
但要问的问题是,为什么是线程阻塞?
https://issues.apache.org/jira/browse/NET-35:S – pstanton 2010-01-25 06:40:02
你可以附加一个调试器的过程?如果是这样,那么你可能会触发代码来保存数据。 – jdigital 2010-01-25 05:29:13
我在过去曾经使用过btrace的情况。 http://kenai.com/projects/btrace/pages/Home – 2010-01-25 05:34:37
你应该说你正在使用什么版本的JVM。 – 2010-01-25 05:44:05