Java JNI:客户端jvm.dll与服务器jvm.dll

Java JNI:客户端jvm.dll与服务器jvm.dll,java,java-native-interface,Java,Java Native Interface,我们有一个本机应用程序,它在其进程中启动jvm,并使用JNI调用Java代码 我们将jvm.dll的位置放在路径中(这在windows上),以便加载它。我们注意到,当我们使用“客户机”目录时,一切正常,但当编译为32位时,当我们使用“服务器”目录时,JNI_CreateJavaVM()失败,返回值为-4 据我所知,JVM的客户端版本和服务器版本都应该可以工作,所以发生了什么事?看起来很可疑,您正在创建一个无法启动的JVM,因为它被配置为使用比可用内存更多的内存 #define JNI_O

我们有一个本机应用程序,它在其进程中启动jvm,并使用JNI调用Java代码

我们将jvm.dll的位置放在路径中(这在windows上),以便加载它。我们注意到,当我们使用“客户机”目录时,一切正常,但当编译为32位时,当我们使用“服务器”目录时,JNI_CreateJavaVM()失败,返回值为-4


据我所知,JVM的客户端版本和服务器版本都应该可以工作,所以发生了什么事?

看起来很可疑,您正在创建一个无法启动的JVM,因为它被配置为使用比可用内存更多的内存

#define     JNI_OK   0
#define     JNI_ERR   (-1)
#define     JNI_EDETACHED   (-2)
#define     JNI_EVERSION   (-3)
#define     JNI_ENOMEM   (-4)
#define     JNI_EEXIST   (-5)
#define     JNI_EINVAL   (-6)
当然,还有其他解释;但是,请检查系统的可用内存、配置参数和最大进程大小(如果您使用的是旧版本的windows)。我想这可能就是你遇到的问题


它还将解释“工作但现在不工作”的问题,因为可能在发生故障时,系统没有足够的空闲内存提交给JVM(JVM在运行之前会抢占其所有内存)。也许您的服务器版本要求“刚好足够”来设置内存限制。

我没有传递任何设置内存限制的选项,所以它应该使用默认值,也许就是这样。奇怪的是,它在编译为64位时可以工作,除非服务器jvm.dll的默认值接近32位地址空间限制。我的计算机有16GB的ram和超过10GB的空闲空间,所以我怀疑它“实际上”内存不足。是否可能是服务器jvm.dll正在执行与您的代码不兼容的操作<代码>当JVM以“服务器”模式启动时,它会执行比“客户端”模式更积极的优化。