![](/img/trans.png)
[英]Is there any way we can execute some java code when a jvm process is killed?
[英]execute new java code in existing jvm process
我有一个当前在Windows shell下运行的java进程。
其中一个负责序列化的线程被无限期阻塞,因此存储在内存中的重要信息不再被写入磁盘。
如果我关闭该过程,信息将丢失。
如果我可以编写和编译一些新代码并让它在相同的内存空间中执行以便在关闭进程之前可以再次序列化所述信息将会很方便。
该过程使用java -jar
命令启动。
有了热点VM的功能,有什么方法可以实现这一点吗?
您可以使用Attach API附加到虚拟机。 这是一篇解释如何使用它的文章
这是一个代码示例:
String agentJAR = "myAgent.jar";
VirtualMachine vm = VirtualMachine.attach (processid);
vm.loadAgent(agentJAR);
代理商是罐子的名称。
代理程序jar包含一个代理程序 ,它可以使用Instrumentation 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/
但问的问题是为什么线程被阻止了?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.