2011-01-12 31 views
4

我对C侧我有建立并返回表示用于图像RGB值的整数的数组的函数以下situtuation,提高JNA性能自动

 

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

    //fill the array 

    return colors; 
    } 
 

在Java侧I它使用检索

 

    //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

您从不free ing颜色数组!除非JNA执行majic,Classic内存泄漏。

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

+0

我的印象是,释放该指针是JNA的工作下,这就是为什么我从来没有免费版了。 – 2011-01-12 22:42:03

+0

nah'这不是jna的工作 – hhafez 2011-01-12 23:28:46

3

除了缺少自由,你必须格外小心,因为这可能会导致内存问题,反正:

,如果多次分配从“c空间”(不是堆)内存,VM不觉得收集垃圾,因为堆空间没有用完。但是DirectByteBuffers只会在finalize方法中释放已分配的c空间 - >这会导致“虚拟”内存泄漏。

您可以使用对“System.gc”的频繁调用进行“解决方法”,或者甚至最好不要分配太多的c内存,例如仅使用单个传输缓冲区。

3

以及内存泄漏mtrautHamza Yerlikaya指出,则也使像素数据的不必要的副本(MemoryImageSource包裹阵列,但随后的Image分配其自己的缓冲器,并复制源像素到它。)

您可以通过创建一个BufferedImage在共享该阵列可以避免这一点:

ColorModel cm = ColorModel.getRGBdefault(); 
DataBuffer buffer = new DataBufferInt(pxs, width * height); 
WritableRaster raster = 
    Raster.createPackedRaster(buffer, width, height, width, 
           new int[] {0xFF0000, 0xFF00, 0xFF, 0xFF000000}, 
           null); 
BufferedImage img = new BufferedImage(cm, raster, false, null);