В настоящее время я работаю с автономным приложением Java Swing, которое является довольно сложным с множеством меток и полей ввода текста.Я обнаружил, что после каждой операции потребление памяти приложением, как в диспетчере задач Windows, увеличивается как минимум на 2 МБ.При достижении общего потребления памяти ~ 305 МБ приложение завершает работу с исключением из нехватки памяти.Я явно упомянул сборщик мусора в обработчике событий, но это не принесло пользы.Я профилировал приложение с JVisualVM.Я обнаружил, что немногие из моих классов имеют граф памяти с наклоном приращения, который никогда не падает.
Но для других классов график вполне нормален, как образец волны, как показано на рисунке ниже:
СверхуНа диаграмме я пришел к выводу, что утечка памяти происходит для класса 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);
Даже это тоже ничего не улучшило, но диаграмма памяти выглядит точно так же.Ниже приведены мои вопросы:
Правильно ли я пришел к выводу, что сам InspectableInputTextImpl вызывает утечку памяти на основе диаграммы?
Если яЯ правильно поделился своими мыслями об устранении проблемы.Преобразует ли это экземпляр в синглтон?