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は、あなたが「空の画像を使用しようとすることができ
私はすでに試しましたが、役に立たないです。 – Wojtek