如何从生命过程中卸载JVM?

时间:2010-06-06 13:35:27

标签: jvm java-native-interface java

我正在使用JNI并尝试使用DestoryJavaVM函数卸载(销毁)VM(我首先调用DetachCurrentThread方法)。它现在似乎已经影响了VM,并且在通话结束后仍然有效。我在旧的Sun帖子中读到DestoryJavaVM过去曾遇到过问题(2001年的JDK1.1-1.3),但我使用的是JRE 6,现在可能应该可以了,对吧? 我需要在相同的生存过程中加载\卸载VM,因为每次加载都需要加载另一个类。有什么想法可以做到吗?

其他信息:

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

谢谢, 盖

4 个答案:

答案 0 :(得分:2)

虽然它不会回答你关于DestroyJavaVM的问题。

OSGi出现在我的脑海中,您可以将所有类放入一个包中,激活它运行代码并停用它,稍后再使用另一个包。请参阅Apache Felix

另一个不太优雅的选择是退出虚拟机并使用另一个类路径重新启动它。

答案 1 :(得分:1)

您可能会检查错误的主题。 The Invocation API: Unloading the VM提到,“VM在实际卸载之前一直等到当前线程是唯一的非守护进程用户线程。”这是Java Language Specification, 12.8所必需的。

答案 2 :(得分:0)

DestroyJavaVM()不支持VM卸载。

  

<强> DestroyJavaVM

     

卸载Java VM并回收其资源。

     

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

     

[...]

     

不支持卸载VM。

首先,文档似乎有点冲突。您可以做的是毫无问题地销毁您的VM,但由于它没有正确卸载,您再也无法在同一过程中重新加载它。

答案 3 :(得分:0)

对于访问此问题的任何新手,请参阅Calling JNI_CreateJavaVM function twice

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