就我而言,java端的savePngImage()
是一个静态函数,它在JNI中调用使用nativeSavePngImage()
库的本地libpng
。
仅供参考,该功能由程序中的多个线程访问,并且应用程序逐步保存了超过数十万个图像,并且在图像计数达到数十万的一个点上,png_create_write_struct()
返回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()
无法分配内存。
如果目前的上述信息无法帮助确定原因,我会非常抱歉,如果可以从您的家伙建议中获得更多调试信息,我会更新帖子。
答案 0 :(得分:1)
malloc()
从C堆中返回内存,以及这是整个进程的C堆还是DLL自己的堆取决于DLL和进程是否共享相同的动态C库。
JNI和Java堆在任何一种情况下都与它无关。
你的其余问题又回到了前面。您知道png_create_write_struct()
在返回NULL时内存已耗尽。