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

pst*_*ton 12 java jvm-hotspot

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

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

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

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

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

有了热点虚拟机功能,有什么方法可以实现这一点吗?

Cha*_*ere 12

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

这是一个代码示例:

String agentJAR = "myAgent.jar";
VirtualMachine vm = VirtualMachine.attach (processid);
vm.loadAgent(agentJAR);
Run Code Online (Sandbox Code Playgroud)

代理商是罐子的名称.

代理程序jar包含一个代理程序,它可以使用Instrumentation API与JVM连接.

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

public static void agentmain(String agentArgs, Instrumentation inst); 
Run Code Online (Sandbox Code Playgroud)

要么

public static void agentmain(String agentArgs); 
Run Code Online (Sandbox Code Playgroud)

仪器对象用于在运行时修改类,你可能并不需要.但希望您可以在agentmain中放置运行所需的任何代码,然后使用attach API在目标JVM中运行它.

祝好运!!

  • 啊。在使用数据在您的实例上尝试之前,您可能想尝试在另一台机器(或另一个 JVM)上复制这种情况。 (2认同)