JNI,如何在JVM外部的C运行时创建大量对象。

时间:2017-08-25 16:08:18

标签: java c java-native-interface

我目前正在开发一个Java / JNI库,以便能够在Java中使用C库。

在视线中,

  • 我将文件(路径/文件名)从Java传递给C,
  • C库打开并读取,
  • C库执行一组内存分配,以便处理文件的内容,
  • 然后可以根据其(种类)字典请求C库。

我的问题如下:

加载的文件大约是200mo(2.000.000行),它在C库中的表示或多或少地占用了相同的空间。文件的所有内容必须存储在RAM中,因为库完成了很多转换。

但是,当C库malloc对象经过一定数量(总共5000行)后,由于RAM的消耗,我遇到了问题。看来,C库使用JVM(已分配)内存执行malloc。

当我使用C runnable运行相同的执行(然后调用C库)时,一切正常,加载了2.000.000行并且库正常工作。

因此,它既不是Java和C之间的通信问题,也不是在两种语言之间传递大对象的问题,而是在使用JNI框架时C中存在大量内存分配的问题。

有什么建议吗? BRgds, 涡。

2 个答案:

答案 0 :(得分:0)

到目前为止,我知道,从C初始化的对象未在JVM堆中初始化。它们在C本机堆中初始化。

当你提出建议时,我认为在RAM中加载200万行是一项艰巨的任务。您可能希望将文件拆分为较小的文件并逐个处理。

答案 1 :(得分:0)

我建议为您的C库创建可执行包装器。在这种情况下,独立的可执行应用程序将在具有自己的内存空间的另一个进程中运行(大小取决于操作系统) 接下来,您可以使用ProcessBuilder运行此可执行文件:

 ProcessBuilder pb = new ProcessBuilder(
                                path to you executable, 
                                path to processed file, 
                                path to out file);
 Map<String, String> env = pb.environment();
 env.put("VAR1", "myValue");
 env.remove("OTHERVAR");
 env.put("VAR2", env.get("VAR1") + "suffix");
 pb.directory(new File("myDir"));
 Process p = pb.start();

例如,上面的可执行进程将通过 out file 写入(返回)结果。此外,您可以将套接字地址 http url 等作为命令参数传递给您的java应用程序将获取结果的目标。