Java - BufferedImage(ImageIO.Read)OutOfMemory堆空间

时间:2012-05-19 20:28:46

标签: java out-of-memory bufferedimage heap-memory javax.imageio

好的,所以我的代码中出现了Out of Memory(堆空间)错误,我已经想出(通过分析)错误来自于图像的创建。

我所拥有的是一个将图像创建为较小图像的类,然后该类将被绘制。

问题在于,如果我想将1000多个这些图像加载到JPanels中,那么在它弹出之前我会达到750左右,而且我真的不想扩展java的内存。

下面是代码:

class Foo extends JPanel{
private BufferedImage image;
private Image scaled;   
public Foo(String link){
    try{
        setPreferredSize(new Dimension(50,50));
        image = ImageIO.read(new URL(link)); //Cause for memory leak
        scaled= image.getScaledInstance(100, 140, BufferedImage.SCALE_FAST);
        image.flush();
                    //tried image = null; but did not help memory
    }
    catch(Exception e){}
}

public void paintComponent(Graphics g){
    super.paintComponent(g);
    g.drawImage(scaled, 5, 5, null);
}
}

所以基本上,是否有更有效的方法来读取图像链接,或者一些如何删除不必要的内存?

2 个答案:

答案 0 :(得分:0)

我不确定这是否足够,但您可以使用以下方法消除scaled的使用:

drawImage(Image img, int x, int y, int width, int height, ImageObserver observer) 

答案 1 :(得分:0)

知道问题......

您可能不需要每次都重新阅读完整的图像。

我已经实现了类似的功能。 我所做的是,我将每个图像的快照存储在所需的大小+我在文件名中包含此快照的时间戳,以便我知道快照是否仍然是最新的。

这不能解决初始快照制作的问题,但不适合以后的使用。