2011-01-12 74 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);