提高JNA性能

时间:2011-01-12 21:36:06

标签: java c jna

我在C方面有以下设置我有一个函数,它构建并返回一个表示图像RGB值的整数数组,


  int* pxs(Image* m){
    int* colors = malloc(height * width * sizeof(int));

    //fill the array

    return colors;
   }

在Java方面,我使用

检索它

     //invoke
     Pointer ptr = ref.getPointer();
     int pxs[] = pointer.getIntArray(0, width*height);

     //to an image
     Image img = Toolkit.getDefaultToolkit().createImage(new MemoryImageSource(width, height, pxs, 0 ,width)); 

然后图像被绘制在一个面板上,从我的时间做大约50 60毫秒的所有时间,图像来自相机,所以我得到一个新的并且画了一个循环,但过了一会儿(10秒左右)我的机器停了下来。我在想这是垃圾收集?所以我想知道是否有办法解决这个问题?

3 个答案:

答案 0 :(得分:3)

你永远不会free颜色阵列!除非JNA做majic,否则经典内存泄漏。

将ByteBuffer传递给本机函数并让pxs使char *填充数据可能是个更好的主意。

答案 1 :(得分:3)

除了缺少免费外,您还必须小心谨慎,因为这可能会导致记忆问题:

如果从“c space”(而不是堆)重复分配内存,则VM不会感觉收集垃圾,因为堆空间没有用尽。但DirectByteBuffers将仅在finalize方法中释放已分配的c空间 - >这导致“虚拟”内存泄漏。

您可以使用频繁调用“System.gc”来解决此问题,甚至可以更好地分配这么多内存,例如只使用一个传输缓冲区。

答案 2 :(得分:3)

除了mtrautHamza Yerlikaya指出的内存泄漏外,您还在制作像素数据的不必要副本(MemoryImageSource包装数组,但随后{ {1}}分配自己的缓冲区并将源像素复制到其中。)

您可以通过创建共享数组的Image来避免这种情况:

BufferedImage