我能否保证在使用JNI时每个进程只有一个JavaVM?

3
我有一个C共享库,通过JNI从Java应用程序中使用。我需要存储一些昂贵的计算数据,这些数据在JavaVM的生命周期内有效。我想将其存储在C中的static变量中,以便仅计算一次。
当然,如果我的库可能从同一进程中的多个JavaVM中使用,则会失败。我的静态值只在第一个JavaVM中有效。如果我的库是通过类上的static块中的System.loadLibrary从Java加载的,是否可能在完全卸载我的C共享库之前跨多个JavaVM使用该库?
1个回答

6

是的。大多数流行的JVM实现,尤其是HotSpot JVM及其衍生版本,只允许一个Java虚拟机在一个进程中运行。

事实上,允许在一个进程中运行多个VM的实现将不符合JNI规范,因为JNI_CreateJavaVMJNI_GetCreatedJavaVMs的文档明确指出:

不支持在单个进程中创建多个VM。


太棒了!那正是我需要的。最受欢迎的那些不行,而且规范也禁止这样做 =D - Cort Ammon
3
但我对将特定实现的编写不足之处纳入规范的概念有困难。特别是定义一个查询“已创建的所有Java VM”的API,然后在文档中写入只能有一个。 - Holger
@Holger 同意。看起来这个函数可能是在限制到一个JVM之前的过时产物。但至少我可以说“所有当前实现都只有一个”,“规范说明只能有一个”,然后我可以进行检查(例如在JNI_OnLoad中)以确认只有一个。 - Cort Ammon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接