从 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 时。