2012-08-24 68 views
-2

我在循環使用ImageIO.read(InputStream爲)從遠程服務器(HttpConnection的和的InputStream)的內存不足錯誤Java堆空間 - 與ImageIO的

使BufferedImages,但它發生了內存Java堆空間每次。

我不知道爲什麼會發生這種情況。

這是我的jvm參數選項。

-verbosegc -XX:+ PrintGCDetails -Xmx1024m - XX:PermSize =128米

和完整的GC日誌。

[Full GC [PSYoungGen: 506K->0K(6656K)] [PSOldGen: 963K->1457K(5504K)] 1469K- 
>1457K(12160K) [PSPermGen: 8556K->8556K(131072K)], 0.0155080 secs] 

[Full GC [PSYoungGen: 480K->0K(11072K)] [PSOldGen: 5001K->4697K(11456K)] 
5481K->4697K(22528K) [PSPermGen: 18222K->18222K(131072K)], 0.0350780 
5481K->secs] 

如你所見,在younggen和oldgen,permgen有自由空間。這是最後一個完整的gc日誌。

記錄後,jvm關機,內存不足。

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 
     at java.awt.color.ICC_Profile.getData(ICC_Profile.java:1315) 
     at java.awt.color.ICC_Profile.getInstance(ICC_Profile.java:762) 
     at com.sun.imageio.plugins.jpeg.JPEGImageReader.setImageData(JPEGImageReader.java:610) 
     at com.sun.imageio.plugins.jpeg.JPEGImageReader.readImageHeader(Native Method) 
     at com.sun.imageio.plugins.jpeg.JPEGImageReader.readNativeHeader(JPEGImageReader.java:561) 
     at com.sun.imageio.plugins.jpeg.JPEGImageReader.checkTablesOnly(JPEGImageReader.java:316) 
     at com.sun.imageio.plugins.jpeg.JPEGImageReader.gotoImage(JPEGImageReader.java:438) 
     at com.sun.imageio.plugins.jpeg.JPEGImageReader.readHeader(JPEGImageReader.java:554) 
     at com.sun.imageio.plugins.jpeg.JPEGImageReader.readInternal(JPEGImageReader.java:940) 
     at com.sun.imageio.plugins.jpeg.JPEGImageReader.read(JPEGImageReader.java:924) 
     at javax.imageio.ImageIO.read(ImageIO.java:1400) 
     at javax.imageio.ImageIO.read(ImageIO.java:1322) 

請幫忙。謝謝。

對不起我的問題。

我已經發布我的源代碼。 它從圖像中提取哈希碼。

1.main codes。主要代碼。

HashExtractor h = new HashExtractor(); 
while(rs.next()) { 
    Inputstream is = getStream(); 
    h.doSomething(is); 
    //something to do using bi. 
    is.close(); 
} 

//in HashExtractor 
public String doSomething(InputStream is) { 
    BufferedImage bi = ImageIO.read(is); 
    String hash = ""; 
    //extract hash. 

    return hash; 
} 

我已經刪除了一些細節,看起來很簡單。 (正在連接..等)

謝謝!

+3

*「請幫助。」*請提出問題。根據你的經驗,我可以想出6個可能會被問到的問題。選一個。您可能還需要添加代碼是保留對早期圖像的引用或每次只引用一個的細節,以及WxH和位深度方面的圖像大小。 –

+3

你可以發佈你的代碼的相關部分?或者你的代碼的[SSCCE](http://sscce.org/)版本?這真的會幫助我們幫助你! – Sujay

+0

我發佈了我的源代碼。謝謝! –

回答

2

在閱讀完BufferedImage之後,您可以獲取ImageReader,並使用ImageReadParam來設置渲染大小,以及任何可以說服它在讀取圖像時執行的操作。這樣你就不會在內存中得到多個圖像副本。

+0

謝謝!我找到了ImageReader的例子。 –