在现有 jvm 进程中执行新的 java 代码
2022-09-04 03:39:38
我有一个Java进程,目前在Windows shell下运行。
负责序列化的线程之一被无限期阻止,因此存储在内存中的重要信息不再写入磁盘。
如果我关闭进程,信息将丢失。
如果我可以编写和编译一些新代码,并让它在同一内存空间中执行,以便在我关闭进程之前可以再次序列化所述信息,那将很方便。
该过程是使用命令启动的。java -jar
借助热点 VM 功能,有没有办法实现这一点?
我有一个Java进程,目前在Windows shell下运行。
负责序列化的线程之一被无限期阻止,因此存储在内存中的重要信息不再写入磁盘。
如果我关闭进程,信息将丢失。
如果我可以编写和编译一些新代码,并让它在同一内存空间中执行,以便在我关闭进程之前可以再次序列化所述信息,那将很方便。
该过程是使用命令启动的。java -jar
借助热点 VM 功能,有没有办法实现这一点?
可以使用附加 API 附加到虚拟机。这是一篇解释如何使用它的文章
下面是一个代码示例:
String agentJAR = "myAgent.jar";
VirtualMachine vm = VirtualMachine.attach (processid);
vm.loadAgent(agentJAR);
其中代理是罐子的名称。
代理 jar 包含一个代理,它可以使用工具 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/
但要问的问题是,为什么线程被阻塞了?