在我的例子中,Java 端的 savePngImage()
是一个静态函数,它在使用 libpng
库的 JNI 中调用 native nativeSavePngImage()
.
仅供引用,该函数由程序中的多个线程访问,应用程序正在逐步保存超过数十万张图像,并且在图像数量达到十万张的某一时刻,png_create_write_struct()
由于分配内存失败而返回 NULL。 java
中的内存设置为-Xms24G -Xmx24G -Xmn20G
发生错误时,物理内存使用率仅为128GB 的30%。
顺便说一句, native 代码中的内存泄漏似乎不是问题,因为任务管理器中显示的内存实际上并没有显示出增加的趋势,尽管我对此可能是非常错误的。
// 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 中的 native 内存是否达到其限制,从而 png_create_write_struct()
无法分配内存。
如果目前的上述信息无法帮助确定原因,我真的很抱歉,如果可以从你们的建议中获得更多调试信息,我会更新帖子。
最佳答案
malloc()
从 C 堆中返回内存,那是整个进程的 C 堆还是 DLL 自己的堆取决于 DLL 和进程是否共享同一个动态 C 库或不是。
在任何一种情况下,JNI 和 Java 堆都与它完全无关。
你的问题的其余部分回到前面。您知道 png_create_write_struct()
在返回 NULL 时内存不足。
关于java - 从 JNI 调用的 DLL 在哪里获取其分配内存,例如 Malloc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44580504/