Mam aplikację kliencką javafx, która po pewnym czasie użycia gromadzi wiele obiektów w dirtynodes [] w jednej ze scen. Narzędzie MAT firmy Eclipse rozpoznało to jako podejrzaną sytuację i możliwy wyciek. Korzysta z 170 MB pamięci, która w moim przypadku wynosi 30%. Są okresowe aktualizacje węzłów w tej scenie. Czy mogę coś z tym zrobić? Czy te dirtynodes zostaną wyczyszczone? Używam java 8 u 51.Przepuszczanie pamięci JavaFX przez dirtynodes
Odpowiedz
Brudne węzły to węzły w scenie, które zostały unieważnione. Są one przetwarzane raz na ramkę, więc jeśli wątek aplikacji JavaFX (wątek UI) jest zajęty, synchronizacja brudnych węzłów nie może się zdarzyć.
Mieliśmy problem na ekranie z listview, gdzie każda komórka listview zawierała wiele prostokątów i tekstów. Cały listview zawierał kilkaset węzłów.
Komórki w widoku listy nie powinny być ponownie używane, ale powinny być tworzone za każdym razem, gdy lista jest odświeżona. Gdy listview miał wiele linii, a użytkownik trzymał pasek przewijania i przesuwał go na minutę, to synchronizacja brudnych węzłów nie mogła się wydarzyć i wyszedł nam z pamięci wyjątek, ponieważ były setki brudnych węzłów.
Moja propozycja polega na sprawdzeniu, czy nie blokujesz wątku aplikacji JavaFX podczas dodawania do niego węzłów.
Dobrą praktyką jest tworzenie węzłów w tle wątku i dodawanie go do sceny w wątku interfejsu użytkownika.
Nie zdziwiłbym się, gdyby węzły tam zostały poddane recyklingowi (wzorzec masy ciężkiej?) ... – Rekin
Nie sądzę, myślę, że tworzy nowe, a zatem brudne węzły zawierają 170 MB danych, ponieważ dotyczy do większej liczby węzłów niż w gui – Martin