我在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秒左右)我的机器停了下来。我在想这是垃圾收集?所以我想知道是否有办法解决这个问题?
答案 0 :(得分:3)
你永远不会free
颜色阵列!除非JNA做majic,否则经典内存泄漏。
将ByteBuffer传递给本机函数并让pxs
使char *
填充数据可能是个更好的主意。
答案 1 :(得分:3)
除了缺少免费外,您还必须小心谨慎,因为这可能会导致记忆问题:
如果从“c space”(而不是堆)重复分配内存,则VM不会感觉收集垃圾,因为堆空间没有用尽。但DirectByteBuffers将仅在finalize方法中释放已分配的c空间 - >这导致“虚拟”内存泄漏。
您可以使用频繁调用“System.gc”来解决此问题,甚至可以更好地分配这么多内存,例如只使用一个传输缓冲区。
答案 2 :(得分:3)
除了mtraut和Hamza Yerlikaya指出的内存泄漏外,您还在制作像素数据的不必要副本(MemoryImageSource
包装数组,但随后{ {1}}分配自己的缓冲区并将源像素复制到其中。)
您可以通过创建共享数组的Image
来避免这种情况:
BufferedImage