Java-BuffereImage(ImageIO.Read)超出内存堆空间

Java-BuffereImage(ImageIO.Read)超出内存堆空间,java,out-of-memory,bufferedimage,heap-memory,javax.imageio,Java,Out Of Memory,Bufferedimage,Heap Memory,Javax.imageio,好的,我的代码中出现了内存不足的堆空间错误,我通过分析发现错误来自于图像的创建 我有一个类,它创建了一个较小的图像,然后这个类将被绘制 问题是,如果我想将1000多个图像加载到JPanels中,在它发出信号之前,我会达到大约750个图像,我并不想扩展java的内存 代码如下: class Foo extends JPanel{ private BufferedImage image; private Image scaled; public Foo(String link){ tr

好的,我的代码中出现了内存不足的堆空间错误,我通过分析发现错误来自于图像的创建

我有一个类,它创建了一个较小的图像,然后这个类将被绘制

问题是,如果我想将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);
}
}

因此,基本上,是否有更有效的方法将链接读取到图像中,或者如何删除不必要的内存?

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

drawImage(Image img, int x, int y, int width, int height, ImageObserver observer) 
知道问题

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

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


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

是否一次显示1000张图像?是的。。。我知道这会占用大量内存,但仍然需要一种方法以较少的内存读取它们。为什么不在需要时读取一组图像,并在不需要时释放它们呢?我只是想制作一种图像库,这样它可以存储x数量的图像,然后将其加载到滚动窗格中,所以当你向下滚动时,你会看到所有的图像。永远不要留下一个空的捕捉块。至少要有e.printStackTrace。如果您知道异常永远不会发生,请在catch块中留下注释,说明为什么该异常永远不会被抛出,但仍然打印堆栈跟踪。如果出现严重错误,最好了解它。imageObserver会是什么?这次我没有得到堆空间错误,但现在我得到了超出GC开销限制的消息。编辑之后不久我就得到了堆空间。