2015-08-01 16 views
5

Ho un'applicazione desktop javafx che dopo un certo periodo di utilizzo accumula un sacco di oggetti in dirtynodes [] in una delle Scene. Lo strumento MAT di Eclipse lo ha riconosciuto come una situazione sospetta e possibile perdita. Sta usando 170 MB di memoria che nel mio caso è del 30%. Ci sono aggiornamenti periodici dei nodi in quella scena. C'è qualcosa che posso fare al riguardo? Quelli sporchi si puliscono? Sto usando java 8 u 51.JavaFX che perde memoria attraverso i dirtynodes

+0

Non sarei sorpreso se i nodi fossero riciclati (modello Flyweight?) ... – Rekin

+0

Non credo, penso che ne crei di nuovi e quindi i nodi sporchi contengono 170 MB di dati perché si riferiscono a più nodi di quanti ce ne siano nella GUI – Martin

risposta

0

I nodi sporchi sono nodi in una scena che sono stati invalidati. Vengono elaborati una volta per frame, quindi se JavaFX Application Thread (thread UI) è occupato, la sincronizzazione dei nodi sporchi non può avvenire.

Abbiamo riscontrato un problema in una schermata con listview in cui ogni cella del listview conteneva molti rettangoli e testi. L'intero listview conteneva alcune centinaia di nodi.
Le celle in listview non dovrebbero essere riutilizzate ma devono essere create ogni volta che la listview viene ridipinta. Quando il listview aveva molte linee e un utente teneva la barra di scorrimento e lo spostava per un minuto, la sincronizzazione dei nodi sporchi non poteva accadere e noi ottenevamo un'eccezione di memoria perché c'erano centinaia di nodi sporchi tousends.

Quindi il mio suggerimento è di verificare se non si sta bloccando il thread di applicazioni JavaFX mentre si aggiungono i nodi.

È buona norma creare nodi nel thread in background e aggiungerlo nella sequenza dell'interfaccia utente.