У меня есть приложение, которое было разработано и успешно развернуто с использованием JavaFX 2.2 на Java 7.< /p>
Когда я обновил/перешел на JavaFX 8.0 (и Java 8), некоторые функции «загадочным образом» переставали работать — в середине жизненного цикла приложения — без каких-либо исключений или других признаков ошибочного изменения состояния. Например; кнопки перестают работать, пользовательские средства визуализации ячеек перестали применяться, включенное/отключенное состояние перестало обновляться.
После многих часов копания я думаю, что отследил проблему до того, что я понимаю. будут некоторые изменения в JavaFX 8 и внутреннее использование javafx.beans.WeakListener для устранения утечек памяти, обнаруженных в JavaFX 2.2. По сути, кажется, что привязки, которые я создаю для управления зависимостью состояния данных, собирают мусор, несмотря на то, что узлы, которыми они управляют, все еще активны.
проблемы чаще всего возникают, когда я создаю экземпляры привязок с использованием анонимных классов. Некоторые, но не все мои проблемы можно решить, сохранив ссылку на привязку в качестве члена класса, тем самым предотвращая ее сбор сборщиком мусора. У меня даже были случаи, когда целые контроллеры подвергались сборке мусора, потому что они создавались посредством загрузки FXML и на них никогда не ссылались напрямую (теперь я всегда помещаю ссылку на контроллер в свойство userData родительского узла).
Мои проблемы:
- связанные ошибки возникают недетерминировано (или, по крайней мере, являются функцией объема памяти).
- если следует избегать привязок через анонимные классы, то потребуется много работы, чтобы найти каждый экземпляр в большой существующей базе кода, чтобы изменить его.
- даже если бы я мог найти каждый экземпляр, это сильно загромождает код.
Любые советы от людей, разрабатывающих нетривиальные приложения JavaFX, мы будем очень признательны. (Я разрабатываю приложения JavaFX 2.x уже 3 года, а приложения Swing более 15 лет, так что это не совсем вопрос n00b).
Примечание. Мой вопрос похож на «Очистка прослушивателей и привязок свойств JavaFX (утечки памяти), но я хочу конкретно и окончательно знать, как использовать сложные привязки и гарантировать, что они не будут собираться мусором в случайное время, не прибегая к загрязняя классы ссылками на каждый экземпляр.
Подробнее здесь: https://stackoverflow.com/questions/282 ... -being-gar