1

さて、コードでメモリ不足(ヒープスペース)エラーが発生し、(プロファイリングを使用して)エラーがイメージの作成に起因していることがわかりました。

私が持っているのは、画像を小さな画像に作成するクラスです。その後、そのクラスがペイントされます。

問題は、これらの画像を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);
}
}

それで、基本的に、画像へのリンクを読み取るためのより効率的な方法はありますか、または何らかの方法で不要なメモリを削除しますか?

4

2 に答える 2

0

これで十分かどうかはわかりませんがscaled、次の方法を使用すると、の使用をなくすことができます。

drawImage(Image img, int x, int y, int width, int height, ImageObserver observer) 
于 2012-05-19T20:33:57.020 に答える
0

問題を知っている...

おそらく、毎回画像全体を読み直す必要はありません。

同様の機能を実装しました。私がしていることは、すべての画像のスナップショットを希望のサイズで保存することです+スナップショットがまだ最新であるかどうかを知るために、このスナップショットのタイムスタンプをファイル名に含めます。

これは、最初のスナップショット作成の問題を解決しませんが、後で使用する場合には問題ありません。

于 2014-01-28T15:42:33.960 に答える