我有一个在单个进程中运行并允许使用模块的 C++ 框架,我想添加的一种类型的模块是加载 JAR 然后调用其中特定的预定义函数的模块。根据用户的需要,可以有任意数量的模块同时运行,这就提出了一个问题:
每个模块是否可以使用 JNI_CreateJavaVM() 创建一个单独的 JVM,并且这些 JVM 彼此完全独立(但是在同一进程中)?或者 Java 内部是否依赖全局变量等,这会使它们相互干扰?
每个进程只允许创建一个虚拟机,并获得一个JNIEnv
。一些非常古老的 JVM 实现曾经支持创建多个 VM,但现在不再支持。
See JNI_CreateJavaVM在甲骨文的Java 7 JNI 文档 https://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/invocation.html:
从 JDK/JRE 1.2 开始,不支持在单个进程中创建多个 VM。
And IBM 的 JDK 7 JNI 文档 https://www.ibm.com/support/knowledgecenter/en/ssw_ibm_i_72/rzaha/invofunc.htm:
IBM i 上的 Java 仅支持在单个作业或进程中创建一个 Java 虚拟机 (JVM)。
(据推测,相同的限制也适用于 IBM AIX JVM)
以及更详细的信息here https://www.ibm.com/support/knowledgecenter/en/ssw_ibm_i_72/rzaha/multjvm.htm:
您无法在一项作业中多次成功调用 JNI_CreateJavaVM(),并且 JNI_GetCreatedJavaVMs() 无法在结果列表中返回多个 JVM。
对在单个作业或进程中仅创建单个 JVM 的支持遵循 Java 的 Oracle America, Inc. 参考实现的标准。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)