6

アプリケーションへの画像の読み込みに問題があります。シンプルな画像ブラウザを作ろうとしています。左側にフォルダのリストがあります。リストのフォルダ名をクリックすると、右側 (フロー ペイン) に画像が表示されます。すべての画像は、境界線のある HBox にあります。しかし、次のようなエラーがすぐに発生します。

java.lang.outofmemoryerror java heap space

タスク マネージャーを見てみました。写真を 6 枚だけ読み込むと、アプリは 500 MB のメモリを消費します。そしてもう1つ-リストのフォルダーを変更すると、メモリが使用されたままになります。別のフォルダーを選択しながら、新しいフローペインを作成しています

flowPane = new FlowPane();

したがって、すべての ImageView を含む古いものは、ガベージ コレクターによって削除されるべきですよね?

アプリ内の画像を効果的に管理するにはどうすればよいですか?

  for(int i = 0 ; i < zdjecia.length; i++){
        ImageView iv2 = new ImageView();
        Image image = new Image("file:"+zdjecia[i].getAbsolutePath());
         iv2.setImage(image);
         if( image.getHeight() > image.getWidth()){
                iv2.fitHeightProperty().bind(szerokoscZdjecia.multiply(0.8).subtract(6));
        }else
                iv2.fitWidthProperty().bind(szerokoscZdjecia.subtract(6));

         iv2.setPreserveRatio(true);
         iv2.setSmooth(true);
         iv2.setCache(false);

         String styl = "-fx-border-color: #b2b3b3;"
                 + "-fx-border-width: 2;";

         HBox boxNaFotke = new HBox();
         boxNaFotke.prefWidthProperty().bind(szerokoscZdjecia);
         boxNaFotke.prefHeightProperty().bind(szerokoscZdjecia.multiply(0.8));
         boxNaFotke.setAlignment(Pos.CENTER);
         boxNaFotke.setStyle(styl);
         boxNaFotke.getChildren().add(iv2);
         fotki.add(boxNaFotke);
         flowPane.getChildren().add(boxNaFotke);
    }
4

2 に答える 2

4

コンストラクターImageを使用してスケーリングすると、必要なメモリの量が大幅に削減されます。

ドキュメントの例:

// 画像をロードし、元の縦横比を維持せずに 100x150 にサイズ変更します
// 画像はクラスパスの my.res パッケージにあります
Image image2 = new Image("my/res/flower.png", 100, 150, false, false);

// 画像をロードし、元の縦横比を維持しながら幅 100 にサイズ変更します//
より高速なフィルタリング方法を使用して
// 画像は http プロトコルを介して提供された URL からダウンロードされます
Image image3 = new Image("http://sample.com/res/flower.png", 100, 0, false, false);

于 2016-04-04T19:42:03.003 に答える
0

JavaFXのメモリにも同様の問題がありますが、setStyleメソッドに接続しています。ヒープの使用状況を分析したところ、StyleHelperオブジェクトがsetStyleメソッド(com.sun.javafx.css.StyleManager $ HolderにGCルートを持つ多くのHashMapインスタンス)によって設定されたすべてのスタイルへのすべての参照を保持していることがわかりました。スタイルが頻繁に変更される場合に問題になる可能性があります。

boxNaFotke.setStyle(styl);にコメントしてみてください。行して、それが役立つかどうかを確認します。

于 2013-03-22T10:34:11.403 に答える