JavaFX:从Memory清理TableView实例

时间:2016-11-25 12:23:35

标签: java memory javafx

我应该如何清理内存中的TableView实例

据我所知,

  1. 删除附在表格上的所有listeners。 (它是否适用于相应表的列和行?)
  2. 清除所有列。 和
  3. 没有对表格实例的强引用。
  4. 从外部参考我做了以下,

    1. 将焦点模型设置为null。
    2. 将鼠标,键侦听器设置为null。
    3. setSelectionModel为null。
    4. setItems为空ObservableArraylist
    5. 最后,我的代码如下所示。

       //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(从profiler获取)仍然在内存中而未被释放 因此,每当我关闭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 个答案:

答案 0 :(得分:0)

3 没有对表格实例的强引用)就足够了。

如果没有更强的引用,则监听器是弱引用,不会阻止GC清理对象。

但是,如果TableView包含在Tab中,则在关闭选项卡时可能不会进行GC,因为JavaFX在其内部保留了对最后一个关闭选项卡的强引用(我花了一些时间才发现它 - 我认为这是一种不受欢迎的类似bug的行为。)