2011-11-22 116 views
1

我正在使用ImageIO API編寫PNG文件。此代碼在循環中調用並導致OutOfMemory錯誤。無論如何,下面的代碼可以修復以避免OutOfMemory錯誤?或者是增加JVM堆大小的唯一選擇?使用ImageIO.read(文件)讀取圖像;導致java.lang.OutOfMemoryError:Java堆空間

File file = new File(resultMap.get("outputFile").toString()); 

//ImageIO to convert jpg to png 
BufferedImage img = ImageIO.read(file); 
file = new File(resultMap.get("outputFile").toString() + ".png"); 
ImageIO.write(img, "png", file); 

Java堆大小爲1024M。

+0

您目前在服務器上的內存設置是什麼?您正在處理的圖像的大小/數量是多少? – Manish

+0

你的堆設置(-Xmx)有多大?你閱讀的圖像有多大? BufferedImage是一個完全未壓縮的圖像,所以即使是一張小的2MB圖像,在完全解壓縮時也可佔用45MB的內存。這樣做的循環,我可以很容易地看到你是如何吹滅你的記憶。 – chubbsondubs

+0

@chubbard圖像爲1MB或更少。什麼是BufferedImage的替代方法? – arjunurs

回答

3

我有一個類似的問題,我必須在36幅圖像中讀取,裁剪並將它們保存到一個新文件(一次一個)。我發現每次迭代後都必須將圖像設置爲null,以允許Java執行垃圾收集。即:

BufferedImage img; 
for (int i=0; i<36; i++) { 
    img = ImageIo.ImageIO.read(anImageFile); 
    /* Do what's needed with the image (cropping, resizing etc.) */ 
    ImageIO.write(img, "jpg", outputFile); 
    img.flush(); 
    img = null; 
} 

我知道這是一箇舊帖子,但我希望它可以幫助未來的人。

2

爲什麼不嘗試撥打flush(BufferedImage。它釋放一些持有的資源。

+0

是不是setUseCache用來啓用/禁用磁盤緩存?這將如何防止OutOfMemoryError? – arjunurs

+0

@apurv對不起,我在想這個API是緩存。修改答案可以嘗試。 –

相關問題