java - 从 JNI 调用的 DLL 在哪里获取其分配内存,例如 Malloc

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

在我的例子中,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/

相关文章:

Java - 如何管理 JNI C 代码中的内存?

java - 在 JNI 中从 C++ 代码创建 New<PrimitiveType>Array 时如何释放 <PrimitiveType>Array 的缓冲区?

java - 异常和堆栈跟踪

java - Junit + Netbeans : Doesn't find methods inside class for test

c++ - 为非 Web 开发人员管理 npm 包安装

c++ - 在并行区域内使用 "throw exception"可以吗?

c++ - 具有 SSL 连接的 SMTP 客户端

java - 打开另一个 JFrame 时 JFrame 卡住

java - 有没有一种简单的方法可以在启动时在露天创建用户/组?

java - Dalvik JNI 何时开始支持固定?