我想問問有沒有人知道JavaFX ImageView如何處理圖像清理。 當圖像對象/內存空閒時。JavaFX ImageView - 圖像清理
這是對我造成問題的情況: 我在場景中有兩個「選項卡」位置。這是我的選項卡:父窗格中的按鈕和切換窗格。每個選項卡都有自己的ImageView。在切換窗格之前,我在舊ImageView上顯示null圖像,然後加載新圖像。我期待在切換標籤後,舊ImageView的舊圖像將是免費的,但事實上並非如此。
爲了監視我使用Java VisualVM工具的行爲,並且從中觸發了GC。我還通過HeapDump驗證了對象列表,並且我可以在imageview上調用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);
}
}
//注意: 我的環境是由:Windows 7的x64bit與Java的x86 jdk8u40
我已經嘗試過但它沒有幫助。 – Wojtek