我有一个当前在 Windows shell 下运行的 java 进程。
负责序列化的线程之一被无限期地阻塞,因此存储在内存中的重要信息不再被写入磁盘。
如果我关闭该过程,信息将丢失。
如果我可以编写和编译一些新代码并让它在同一个内存空间中执行,这样在我关闭进程之前可以再次序列化所述信息,那将是很方便的。
该过程是使用java -jar
命令启动的。
有了热点虚拟机功能,有没有办法实现这一点?
我有一个当前在 Windows shell 下运行的 java 进程。
负责序列化的线程之一被无限期地阻塞,因此存储在内存中的重要信息不再被写入磁盘。
如果我关闭该过程,信息将丢失。
如果我可以编写和编译一些新代码并让它在同一个内存空间中执行,这样在我关闭进程之前可以再次序列化所述信息,那将是很方便的。
该过程是使用java -jar
命令启动的。
有了热点虚拟机功能,有没有办法实现这一点?
您可以使用附加 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 中运行它。
祝你好运!!
您可以尝试注册一个信号处理程序,这在 Windows 上比在其他平台上更受限制。
示例和描述 http://www.ibm.com/developerworks/java/library/i-signalhandling/
但是要问的问题是为什么线程被阻塞了?