我有奇怪的情况:我们有.dll库(让我们称之为'sdk_wrapper'),它是java类的包装器,它打开JRE jvm.dll并使用其他一些.dll(PKCS11实现,更具体 - 但我认为没关系)。
当我在我的c ++程序中直接使用sdk_wrapper(别名'run_dll')时,一切正常。但是当我将它打包到另一个.dll(准备配置文件,初始化库等)并导出一个函数,这个函数与程序'run_dll'相同时,调用它会导致jvm初始化错误:Could not reserve enough space for object heap
。 JVM.dll初始化正在使用-Xmx512m
。
你知道发生了什么吗?我认为JVM需要连续的部分内存来初始化,但是直接从程序和另一个dll调用'sdk_wrapper'之间的区别是什么?它们位于同一个地方(我的意思是在同一个目录中)。
答案 0 :(得分:1)
当您将库加载到内存中时,您将结束地址空间的内存碎片。 Win32特别糟糕。
注意:如果您使用的是64位进程,则这不是问题,因为您将拥有足够的虚拟内存。