Утечка памяти и OutOfMemoryException - Приложение Java Swing - PullRequest
2 голосов
/ 24 сентября 2019

В настоящее время я работаю с автономным приложением Java Swing, которое является довольно сложным с множеством меток и полей ввода текста.Я обнаружил, что после каждой операции потребление памяти приложением, как в диспетчере задач Windows, увеличивается как минимум на 2 МБ.При достижении общего потребления памяти ~ 305 МБ приложение завершает работу с исключением из нехватки памяти.Я явно упомянул сборщик мусора в обработчике событий, но это не принесло пользы.Я профилировал приложение с JVisualVM.Я обнаружил, что немногие из моих классов имеют граф памяти с наклоном приращения, который никогда не падает.Memory Usage graph for class InspectableInputTextImpl

Но для других классов график вполне нормален, как образец волны, как показано на рисунке ниже: Memory Usage graph for class char array

СверхуНа диаграмме я пришел к выводу, что утечка памяти происходит для класса InspectableInputTextImpl.Чтобы исправить это, я добавил для указанного класса инстанцирование weakReference, как показано ниже:

InspectableInputTextImpl inputText = new InspectableInputTextImpl(screen, componentId, length);
        WeakReference<InspectableInputTextImpl> weakInputText = new WeakReference<InspectableInputTextImpl>(inputText);
        ((TInputText) weakInputText.get()).setCustomDocument(new TRestrict4InputTextDocument());
        ((TInputText) weakInputText.get()).setMaxLength(maxLength);
        ((TInputText) weakInputText.get()).setRequirement(required);

Даже это тоже ничего не улучшило, но диаграмма памяти выглядит точно так же.Ниже приведены мои вопросы:

  1. Правильно ли я пришел к выводу, что сам InspectableInputTextImpl вызывает утечку памяти на основе диаграммы?

  2. Если яЯ правильно поделился своими мыслями об устранении проблемы.Преобразует ли это экземпляр в синглтон?

1 Ответ

0 голосов
/ 27 сентября 2019

Я бы предложил проанализировать дамп кучи, чтобы проверить причину утечки памяти.Вы можете запустить ваше приложение с параметром -XX: + HeapDumpOnOutOfMemoryError VM, и оно создаст файл .hprof с дампом кучи в момент сбоя.Затем вы можете использовать инструмент, такой как Eclipse MAT , чтобы посмотреть на дамп.Он может подтвердить ваши подозрения в отношении InspectableInputTextImpl или дать вам другую подсказку.

Вы можете решить, как решить проблему (ваш вопрос 2) после того, как убедитесь, что именно проблема (ваш вопрос 1).

...