Java - BufferedImage (ImageIO.Read) 内存不足堆空间



好的,所以我在代码中收到内存不足(堆空间(错误,并且我已经发现(通过分析(该错误来自创建图像。

我有一个类,它将图像

创建为较小的图像,然后将绘制该类。

问题是,如果我想将 1000+ 个这些图像加载到 JPanel 中,我会在它点击之前达到大约 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);
}
}

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

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

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

知道问题...

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

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

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

相关内容

最新更新