2016-04-03 17 views
0

JavaFX ImageViewがイメージクリーンナップをどのように処理するか知っていますか? イメージオブジェクト/メモリがフリーの場合。JavaFX ImageView - イメージクリーンアップ

私には問題が発生する状況は次のとおりです。 シーンに2つの「タブ」があります。これは私のタブです:親ペインのボタンと切り替えペイン。各タブには独自のImageViewがあります。ペインを切り替える前に、古いImageViewのImageをヌルにしてから、新しいImageViewをロードします。私は、古いImageViewからの古いImageは、無料であるが、実際にはそうではないことを、タブの切り替え後に期待していた。

動作を監視するために、私はJava VisualVMツールを使用していましたが、GCからトリガーしていました。私はHeapDumpでオブジェクトのリストを検証していました。イメージビューでsetImage(null)を呼び出した後のイベントがImageView内にまだ保持されていてGCで収集できないことを確認できます。

メモリを節約するために古い画像を消去するためにImageViewをトリガーする方法をお勧めします。

以下

は、この問題のsutuationを示したコードです:

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.image.Image; 
import javafx.scene.image.ImageView; 
import javafx.scene.layout.BorderPane; 
import javafx.scene.layout.VBox; 
import javafx.stage.Stage; 


public class IVTestApp extends Application { 

    private String img1 = "http://formaciononline.co/wp-content/uploads/2014/05/aprender-a-programar-en-Java.jpg"; 
    private String img2 = "https://madushan1995.files.wordpress.com/2015/02/java-institute-new-final.png"; 

    @Override 
    public void start(Stage primaryStage) throws Exception { 
     BorderPane bp = new BorderPane(); 

     BorderPane p1 = new BorderPane(); 
     ImageView iv1 = new ImageView(); 
     iv1.setPreserveRatio(true); 
     iv1.setFitHeight(200); 
     iv1.setFitWidth(300); 
     p1.setCenter(iv1); 

     BorderPane p2 = new BorderPane(); 
     ImageView iv2 = new ImageView(); 
     iv2.setPreserveRatio(true); 
     iv2.setFitHeight(200); 
     iv2.setFitWidth(300); 
     p2.setCenter(iv2); 

     Button tab1 = new Button("tab1"); 
     Button tab2 = new Button("tab2"); 

     tab1.setOnAction(e -> { 
      iv2.setImage(null); 
      iv1.setImage(new Image(img1)); 
      bp.setCenter(p1); 
     }); 

     tab2.setOnAction(e -> { 
      iv1.setImage(null); 
      iv2.setImage(new Image(img2)); 
      bp.setCenter(p2); 
     }); 

     bp.setLeft(new VBox(tab1, tab2)); 

     Scene scen = new Scene(bp); 
     primaryStage.setScene(scen); 
     primaryStage.setWidth(600); 
     primaryStage.setHeight(400); 
     primaryStage.show(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 

} 

//注: マイ的環境を構成したのJavaのx86とWindows 7のx64bitは、あなたが「空の画像を使用しようとすることができ

答えて

0

をjdk8u40 "(例えば、必要なサイズの100%透過画像 - アルファチャンネルで簡単に行うことができます)。これはメモリに保持されたイメージを置き換え、ガーベジコレクション可能にする必要があります。

+0

私はすでに試しましたが、役に立たないです。 – Wojtek

関連する問題