我是否保证每个使用 JNI 的进程只有一个 JavaVM?
Am I guaranteed to have exactly one JavaVM per process using JNI?
我有一个 C 共享库,它通过 JNI 从 Java 应用程序中使用。我需要存储一些计算成本高昂的数据,这些数据在 JavaVM
的生命周期内有效。我想将它存储在 C 中的 static
变量中,以便它只计算一次。
当然,如果我的库可能在同一进程中被多个 JavaVM
使用,那么这将失败。我的静态值仅在第一个 JavaVM
中有效。如果我的库是在 class 上的 static
块中通过 System.loadLibrary
从 Java 加载的,那么该库是否有可能在多个 Java 中使用]虚拟机无需完全卸载我的 C 共享库?
是的。最流行的 JVM 实现,特别是 HotSpot JVM 及其衍生产品,每个进程只允许一个 Java 虚拟机。
事实上,在一个进程中允许多个 VM 的实现将不符合 JNI 规范,因为 JNI_CreateJavaVM and JNI_GetCreatedJavaVMs 的文档明确指出
Creation of multiple VMs in a single process is not supported.
我有一个 C 共享库,它通过 JNI 从 Java 应用程序中使用。我需要存储一些计算成本高昂的数据,这些数据在 JavaVM
的生命周期内有效。我想将它存储在 C 中的 static
变量中,以便它只计算一次。
当然,如果我的库可能在同一进程中被多个 JavaVM
使用,那么这将失败。我的静态值仅在第一个 JavaVM
中有效。如果我的库是在 class 上的 static
块中通过 System.loadLibrary
从 Java 加载的,那么该库是否有可能在多个 Java 中使用]虚拟机无需完全卸载我的 C 共享库?
是的。最流行的 JVM 实现,特别是 HotSpot JVM 及其衍生产品,每个进程只允许一个 Java 虚拟机。
事实上,在一个进程中允许多个 VM 的实现将不符合 JNI 规范,因为 JNI_CreateJavaVM and JNI_GetCreatedJavaVMs 的文档明确指出
Creation of multiple VMs in a single process is not supported.