如何从活动进程中卸载JVM?

如何从活动进程中卸载JVM?,jvm,java-native-interface,java,Jvm,Java Native Interface,Java,我正在使用JNI并尝试使用DestoryJavaVM函数(我首先调用DetachCurrentThread方法)卸载(销毁)VM。看起来It现在已经对VM产生了影响,并且在调用之后它仍然处于运行状态。我在旧的Sun帖子中读到DestryJavaVM在过去有问题(2001年的JDK1.1-1.3),但我使用的是JRE 6,它现在应该可以工作了,对吗? 我需要在同一个活动过程中加载\卸载VM,因为每次加载都需要加载另一个类。你知道怎么做吗 其他信息: 在卸载阶段,我可以成功地分离CurrentThr

我正在使用JNI并尝试使用DestoryJavaVM函数(我首先调用DetachCurrentThread方法)卸载(销毁)VM。看起来It现在已经对VM产生了影响,并且在调用之后它仍然处于运行状态。我在旧的Sun帖子中读到DestryJavaVM在过去有问题(2001年的JDK1.1-1.3),但我使用的是JRE 6,它现在应该可以工作了,对吗? 我需要在同一个活动过程中加载\卸载VM,因为每次加载都需要加载另一个类。你知道怎么做吗

其他信息:

在卸载阶段,我可以成功地分离CurrentThread和destroyVM(两者都返回JNI_OK)。我甚至成功地创建了FreeLibrary(jvm.dll)(返回1)。 当我再次尝试加载JVM时,我可以LoadLibrary(),然后在DLL中找到CreateVM函数,对CreateVM的调用失败(返回-1)。我做错了什么

谢谢,
盖伊

虽然它不能回答你关于Java虚拟机的问题

在我看来,OSGi可以将所有类放在一个包中,激活它,运行代码并停用它,然后再使用另一个包。看


另一个不那么优雅的选择是退出vm并用另一个类路径重新启动它。

您可能会检查错误的线程。提到,“虚拟机等待当前线程成为唯一的非守护进程用户线程,然后才实际卸载。”这是。

不支持虚拟机卸载所必需的

销毁JavaVM

卸载Java虚拟机并回收其资源

任何线程,无论是否连接,都可以调用此函数。如果连接了当前线程,VM将等待,直到当前线程成为唯一的非守护进程用户级Java线程。如果当前线程未连接,VM将连接当前线程,然后等待直到当前线程成为唯一的非守护进程用户级线程

[……]

不支持卸载VM


文档一开始似乎有点冲突。你所能做的就是毫无问题地销毁你的虚拟机,但由于它无法正常卸载,你永远无法在同一过程中再次重新加载它。

对于任何访问此问题的新手,请参阅


简短回答:您不能在一个进程中创建多个JVM(这是出于设计)。

这可能会给一个足够复杂的应用程序带来问题,因为您无法完全控制所有线程(即第三方库)。我认为最好重新设计,让JVM重新加载类(例如OSGi)。不过,这很可能回答了OP的问题。我正在使用JRE 1.6,所以销毁应该可以工作。查看我在原始帖子中添加的其他信息。@Guy:您提到对
JNI\u CreateJavaVM()
的第二次调用返回-1。
ExceptionOccurred()
说了什么?@trashgood:当JVM创建失败时,我怎么能env->ExceptionOccurred()?env应该由CreateVM初始化,我在这里遗漏了什么吗?@trashgood:我可以看到返回的错误代码是-1(JNI_ERR),这是未知错误。对不起,我不打算使用OSGi解决方案。请查看其他信息,也许您可以提供帮助。