从JNI调用的DLL从哪里获取其内存以进行分配,例如Malloc

时间:2017-06-16 03:51:08

标签: java c++ java-native-interface libpng

就我而言,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()无法分配内存。

如果目前的上述信息无法帮助确定原因,我会非常抱歉,如果可以从您的家伙建议中获得更多调试信息,我会更新帖子。

1 个答案:

答案 0 :(得分:1)

malloc()从C堆中返回内存,以及这是整个进程的C堆还是DLL自己的堆取决于DLL和进程是否共享相同的动态C库。

JNI和Java堆在任何一种情况下都与它无关。

你的其余问题又回到了前面。您知道png_create_write_struct()在返回NULL时内存已耗尽。