从 JNI 调用的 DLL 在哪里获取其分配内存,例如 Malloc
Where does DLL that get called from JNI get its memory for allocation such as Malloc
在我的例子中,java 端的 savePngImage()
是一个静态函数,它在使用 libpng
库的 JNI 中调用本机 nativeSavePngImage()
。
仅供参考,该函数由程序中的多个线程访问,应用程序正在逐步保存超过十万张图像,并且在图像数量达到十万的时候,png_create_write_struct()
return NULL 由于分配内存失败。 java
中的内存设置为-Xms24G -Xmx24G -Xmn20G
,发生错误时,物理内存使用率仅为128GB的30%。
顺便说一句,本机代码中的内存泄漏似乎不是问题,因为任务管理器中显示的内存实际上并没有显示出增加的趋势,尽管我对此可能大错特错。
// create the png structures
png_structp pWriteStruct = png_create_write_struct(PNG_LIBPNG_VER_STRING,
(png_voidp)NULL,
pngErrorFunction,
pngErrorFunction);
if (pWriteStruct == NULL)
{
fclose(pFile);
sptAssert(false); //getting assertion here
return;
}
因此,我的问题是我们如何知道 JNI 中的本机内存是否达到其限制,从而 png_create_write_struct()
无法分配内存。
如果当前以上信息无法帮助确定原因,我真的很抱歉,如果可以从你们的建议中获得更多调试信息,我会更新post。
malloc()
returns内存超出C堆,是整个进程的C堆还是DLL自己的堆取决于DLL和进程是否共享同一个动态C库与否。
JNI 和 Java 堆在任何一种情况下都与它完全无关。
你的问题的其余部分回到前面。您知道 png_create_write_struct()
运行 内存不足 当它 returns NULL 时。
在我的例子中,java 端的 savePngImage()
是一个静态函数,它在使用 libpng
库的 JNI 中调用本机 nativeSavePngImage()
。
仅供参考,该函数由程序中的多个线程访问,应用程序正在逐步保存超过十万张图像,并且在图像数量达到十万的时候,png_create_write_struct()
return NULL 由于分配内存失败。 java
中的内存设置为-Xms24G -Xmx24G -Xmn20G
,发生错误时,物理内存使用率仅为128GB的30%。
顺便说一句,本机代码中的内存泄漏似乎不是问题,因为任务管理器中显示的内存实际上并没有显示出增加的趋势,尽管我对此可能大错特错。
// create the png structures
png_structp pWriteStruct = png_create_write_struct(PNG_LIBPNG_VER_STRING,
(png_voidp)NULL,
pngErrorFunction,
pngErrorFunction);
if (pWriteStruct == NULL)
{
fclose(pFile);
sptAssert(false); //getting assertion here
return;
}
因此,我的问题是我们如何知道 JNI 中的本机内存是否达到其限制,从而 png_create_write_struct()
无法分配内存。
如果当前以上信息无法帮助确定原因,我真的很抱歉,如果可以从你们的建议中获得更多调试信息,我会更新post。
malloc()
returns内存超出C堆,是整个进程的C堆还是DLL自己的堆取决于DLL和进程是否共享同一个动态C库与否。
JNI 和 Java 堆在任何一种情况下都与它完全无关。
你的问题的其余部分回到前面。您知道 png_create_write_struct()
运行 内存不足 当它 returns NULL 时。