Утечка памяти в шине GXT HandlerManager - PullRequest
1 голос
/ 04 мая 2019

Я ищу утечку памяти в приложении GWT. Я начал с Chrome, чтобы создавать дампы кучи и сравнивать их после определенных действий.

В сводке по каждому дампу кучи я вижу, что после большого количества массивов, Maps, HashMaps одной из самых больших групп классов является класс HandlerManager.Bus. Каждый элемент HandlerManager.Bus содержит несколько карт. Каждый клик они накапливаются в куче, и они не удаляются GC.

Запуск GC вручную также не помогает.

Дальнейшее чтение показывает, что HandlerManager имеет отношение к ClickEvents и MouseEvents. Сейчас я ищу те события и исходный код, где они связаны с полями представлений, сетками и другим кодом gwt / gxt.

Пожалуйста, дайте несколько советов, что обычно может пойти не так в этих классах.

Я предполагаю, что есть некоторые статические классы и никогда не теряют ссылку на эти события, поэтому GC не может их удалить.

Жаль, что я не могу следить за объектами памяти в куче так же легко, как в MAT.

Спасибо за ваши предложения.

1 Ответ

0 голосов
/ 08 мая 2019

Я определенно видел эту проблему раньше. Вы заметите, что все вызовы, которые добавляют обработчики, возвращают HandlerRegistration. Сохраните их в списке. Когда вы закончите с классом, который содержит список обработчиков, просмотрите список и удалите каждый обработчик. Я давно не видел GWT / GXT, но думаю, что-то вроде этого.

List<HandlerRegistration> handlerList = new LinkedList<>();

public void addListeners() {
    handlerList.add(myComboBox.addListener(mySelectionHandler));
}

public void onClose() {
    handlerList.forEach(handler -> handler.removeHandler());
}
...