从动态库调用jni时,JVM堆内存不足

Not enough memory for JVM heap when calling jni from dynamic library

本文关键字:JVM 内存不足 jni 动态 调用      更新时间:2023-10-16

我有一个奇怪的情况:我们有。dll库(让我们称之为'sdk_wrapper'),这是java类的包装器,它正在打开JRE jvm.dll并使用其他一些。dll (PKCS11实现,更具体地说-但我认为这并不重要)。

当我直接在我的c++程序(别名'run_dll')中使用sdk_wrapper时,一切工作正常。但是,当我将它打包到另一个.dll(准备配置文件,初始化库等)并导出一个函数,该函数与程序'run_dll'一样,调用这会导致jvm初始化错误:Could not reserve enough space for object heap

JVM.dll的初始化是用-Xmx512m做的。你知道发生了什么事吗?我读到JVM需要连续的内存部分来初始化,但是直接从程序和从另一个dll调用'sdk_wrapper'之间的区别是什么?它们在同一个地方(我的意思是在同一个目录中)。

当您将库加载到内存中时,您将结束地址空间的内存碎片。Win32在这方面尤其糟糕。

注意:如果你使用64位进程,这不是一个问题,因为你将有足够的虚拟内存