14

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

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

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

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

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

有了热点虚拟机功能,有没有办法实现这一点?

4

2 回答 2

12

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

这是一个代码示例:

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 中,然后使用附加 API 在目标 JVM 中运行它。

祝你好运!!

于 2010-01-25T05:48:47.500 回答
0

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

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

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

于 2010-01-25T06:17:04.207 回答