2016-11-25 27 views
3

我應該如何從內存清理TableView實例清理的TableView例如,JavaFX的:從內存

從我瞭解到,

  1. 拆下連接到表中的所有listeners。 (是否適用於相應的表格行和列?)
  2. 清除所有列。 和
  3. 沒有強引用表的實例。

從外部基準我做了以下,

  1. 組焦點模型爲空。
  2. 將鼠標,鍵監聽器設置爲null。
  3. setSelectionModel爲空。
  4. setItems變爲空的ObservableArraylist

最後,我的代碼如下所示。

//I gave a try for, RowFactory and ColumnFactory to null.  
      tableView.setRowFactory(null); 
      for (TableColumn column : this.tableView.getColumns()) { 
       column.setCellFactory(null); 
       column.setCellValueFactory(null); 
      } 
      tableView.getFocusModel().focus(null); 
      tableView.setOnMouseClicked(null); 
      tableView.setSelectionModel(null); 
      tableView.getColumns().clear(); 
      tableView.setItems(FXCollections.observableArrayList()); 
      tableView = null; 

我的問題是:

我有多個表視圖打開,當我關閉,(HashMapNode(從探查得)相關TableView仍然在內存中並不會公佈) 所以每當我關閉一個tableView我稱之爲上面的代碼。

還有,我用內部類setCellFactory像下面,

column.setCellFactory((TableColumn<?, ?> param) -> new EditingTableCell()); 

private class EditingTableCell extends TableCell<?, ?> { 
//..... 
} 

所以,我應該怎麼正確清理TableView實例,這樣它會被垃圾收集。

Java版本:1.8.0_45

JavFX版本:8.0.45-B11

+1

從你的問題不清楚,但 - 你實際上是否從場景圖中刪除它? 另外 - 這實際上是一個問題?即使當一個對象不再被引用時,只要有足夠的可用空間,GC不會保證是否和何時GC決定收集它,因此GC可能不會打擾收集它。 – Itai

+0

@sillyfly準確地說,問題是要在TableView實例上完成哪些步驟,以便它可以被GC化(在某些時候)。就像你說的那樣從場景圖中刪除它。是的,我從場景圖中刪除它。我瞭解它到什麼時候收集它,但即使沒有足夠的可用空間可用時,也不會收集它,我很確定它駐留在內存中。 – user3164187

+0

刪除附加到表的列表是正確的。但是將'setonmouseclicked'設置爲空不是刪除列表器的正確方法。確認你真的刪除了添加了addListner或綁定的列表 – user43968

回答

0

沒有很強的參考表實例)應足夠。

監聽器是弱引用,它不會阻止GC清除對象,如果沒有更強的引用。但是,如果TableView包含在一個Tab中,它可能在選項卡關閉時不會GC'd,因爲其內部的JavaFX保持對最後一個關閉選項卡的強引用(這是一個gotcha,它花了我一段時間才找到出 - 我認爲這是一個不需要的錯誤行爲)。