2016-11-25 1 views
3

Comment dois-je nettoyer une instance TableView de la mémoire,JavaFX: Nettoyer une instance TableView de la mémoire

D'après ce que j'ai appris,

  1. Retirez tous listeners fixé à la table. (s'applique-t-il même aux colonnes et aux lignes de la table correspondante?)
  2. Effacer toutes les colonnes. et
  3. Aucune référence forte à l'instance de table.

D'une référence externe je l'ai fait ce qui suit,

  1. ensemble modèle de mise au point sur null.
  2. Définir la souris, écouteurs de clé à null.
  3. setSelectionModel à null.
  4. setItems à ObservableArraylist vide.

Enfin, Mon code ressemble à quelque chose comme ci-dessous.

//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; 

Mon problème est:

J'ai plusieurs vues de table ouvert et quand je ferme, (HashMapNode (obtenu de profileur) liée à TableView est toujours en mémoire et non libéré) Donc, chaque fois que je fermer un tableauVoir j'appelle le code ci-dessus.

Aussi, j'utiliser les classes internes à setCellFactory comme ci-dessous,

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

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

Alors, comment dois-je nettoyer correctement une instance TableView afin qu'il sera nettoyé.

Java Version: 1.8.0_45

JavFX Version: 8.0.45-b11

+1

Ce n'est pas clair à partir de votre question, mais - le retirez-vous réellement du graphe de scène? Aussi - est-ce réellement un problème?Même lorsqu'un objet n'est plus référencé, il n'y a aucune garantie si et quand le GC décidera de le collectionner, tant qu'il y a suffisamment d'espace libre, il est donc possible que le GC ne prenne pas la peine de le collectionner. – Itai

+0

@sillyfly Pour être précis, la question est de savoir quelles sont les étapes à effectuer sur l'instance de TableView pour qu'elle soit GC (à un moment donné). comme l'enlever du graphique de scène comme vous l'avez dit. Oui, je l'enlève du graphique de la scène. et je comprends son GC jusqu'à quand le recueillir, mais il n'est pas recueilli, même quand il n'y a pas assez d'espace libre, je suis sûr qu'il réside dans la mémoire. – user3164187

+0

La suppression des listes jointes à la table est vraie. Mais définir 'setonmouseclicked' sur null n'est pas la bonne façon de supprimer listner. vérifiez que vous supprimez vraiment les listes ajoutées avec addListner ou bind – user43968

Répondre

0

(Aucune référence forte à l'instance de table) devrait être assez.

Les éléments d'écoute sont des références faibles qui n'empêchent pas le CPG de nettoyer l'objet s'il n'y a pas de références plus fortes. Cependant, si le TableView est contenu dans un onglet, il peut ne pas être GC'd à la fermeture de la tabulation, parce que JavaFX dans ses internes garde une forte référence au dernier onglet fermé (un gotcha il m'a fallu un moment pour trouver out - Je considère comme un comportement indésirable de type bug).