在现有jvm进程中执行新的java代码

在现有jvm进程中执行新的java代码,java,jvm-hotspot,Java,Jvm Hotspot,我有一个java进程正在windows shell下运行 负责序列化的一个线程被无限期阻塞,因此存储在内存中的重要信息不再写入磁盘 如果我关闭进程,信息将丢失 如果我可以编写和编译一些新代码,并让它在相同的内存空间中执行,以便在关闭进程之前可以再次序列化所述信息,这将是非常方便的 该过程是使用java-jar命令启动的 有了hotspot VM功能,有什么方法可以实现这一点吗?您可以使用连接到虚拟机 下面是一个代码示例: String agentJAR = "myAgent.jar"; Virt

我有一个java进程正在windows shell下运行

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

如果我关闭进程,信息将丢失

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

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

有了hotspot VM功能,有什么方法可以实现这一点吗?

您可以使用连接到虚拟机

下面是一个代码示例:

String agentJAR = "myAgent.jar";
VirtualMachine vm = VirtualMachine.attach (processid);
vm.loadAgent(agentJAR);
其中代理是您的jar的名称

代理jar包含一个接口,它可以使用检测API与JVM接口

要创建在运行时加载的代理,可以实现如下的
agentmain
函数:

public static void agentmain(String agentArgs, Instrumentation inst); 

该对象用于在运行时修改类,您可能不需要这样做。但希望您可以将需要运行的任何代码放在agentmain中,然后使用attach API在目标JVM中运行它


祝你好运

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

示例和说明


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

您可以将调试器附加到进程吗?如果是这样的话,那么您可能能够触发代码来保存数据。你应该说你正在使用的JVM的版本。只是给任何打算尝试这个的人一个提示。。有时,您只能获得一次附加到流程的机会,因此,请确保在执行此操作时已准备好所有内容并进行了测试。我经常发现,当你第二次尝试附加到这个过程时,什么都不会发生。祝你好运谢谢,这可能是最好的选择,但是我怀疑我是否能够做我想做的事情——有人可以控制对象字段(没有静态引用)并序列化它。不过我会尽我最大的努力!实际上,我可以通过在特定线程上抛出异常来解决问题。此线程当前无限期挂起在套接字上。我知道如何获取线程的句柄,需要在其中抛出异常,或者可以终止并重新启动它。我会努力的。谢谢。你可以试着打断一下。啊。您可能想在另一台机器(或另一个JVM)上复制这种情况,然后再在您的实例上使用data.WOW!成功了!必须使用反射来创建阻塞线程的副本,并启动副本。我真不敢相信这会奏效。再次感谢!
public static void agentmain(String agentArgs);