У меня есть приложение JavaFX, которое минимизируется в лотке при нажатии кнопки X. Я отслеживаю приложение через VisualVM для тенденций в области памяти.
Странная часть - это когда приложение открыто или сводится к панели задач, память всегда возвращается обратно в исходную память. Однако, когда он сведен к минимуму в лоток (stage.hide()
, systemTray.show()
), память получает GCed, но в восходящем тренде (утечке).
В VisualVM пространство старого поколения продолжает расти, и как только он достигнет максимума через некоторое время, приложение будет не отвечать на запросы, а процессор скачет до 80%.
Я заметил, что , если я stage.show()
в приложении, дважды щелкнув значок в трее и т.д., GC очистит все до нормального. Однако, если оставить его на длительные периоды, он просто не сможет GC старого поколения.
Сброс кучи показывает javafx.scene.Scene#7
и javafx.scene.Node[]#2
как наиболее сохраненное пространство. Оба не будут отображаться, если сцена не скрыта. По ссылкам, это показывает
this[] -> dirtyNodes()
.
this - value: javafx.scene.Node[] #2
<- dirtyNodes - class: javafx.scene.Scene, value: javafx.scene.Node[] #2
<- value - class: javafx.scene.Node$ReadOnlyObjectWrapperManualFire, value:
javafx.scene.Scene #7
Что вызывает это и как я могу это решить?