内存不足错误Java堆空间 - 使用ImageIO

时间:2012-08-24 02:17:03

标签: java image garbage-collection out-of-memory javax.imageio

我在循环中使用ImageIO.read(InputStream is)从远程服务器(HttpConnection和InputStream)制作BufferedImages

但是,每次都会发生内存中的java堆空间。

我不知道为什么会这样。

这是我的jvm参数选项。

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

和完整的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.主要代码。

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;
}

我删除了一些细节看起来很简单。 (获得连接......等)

谢谢!

1 个答案:

答案 0 :(得分:2)

而不是在阅读之后对BufferedImage进行所有操作,而是为其获取ImageReader并使用ImageReadParam来设置渲染大小,以及其他任何可以说服它的内容在阅读图像的同时做。这样你就不会在内存中得到多个图像副本。