Как получить AppContext для выпуска компонентов AWT, чтобы они могли быть удалены? - PullRequest
4 голосов
/ 06 мая 2011

Моя команда работает над анализом нашего приложения Swing, чтобы убедиться, что все собирается мусором, когда он больше не используется.Мы сталкиваемся со странной проблемой.

Мы просто открываем новое окно (JFrame) и закрываем его.Этот фрейм содержит класс EmptyPanel (который содержит короткое сообщение о том, что данных нет) и пользовательский класс JMeunBar.Мы вообще не взаимодействуем с этим - просто немедленно закрываем окно.

Затем мы запускаем сборку мусора и делаем дамп кучи.

После анализа дамп кучи JMenuBar не сборщик мусора.Он хранится открытым от корня GC sun.awt.AppContext.

Как мы можем это очистить?Или это то, о чем нам не нужно беспокоиться по какой-то причине?Мы хотим быть усердными, следя за тем, чтобы наше приложение само очищалось, но мы также не хотим вращать наши колеса.

AppContext.mainAppContext содержит HashMap, который содержит экземпляр BasicPopupMenuUI.MenuKeyboardHelperВнутри него находится ComponentInputMapUIResource.menuInputMap, в котором этот JMenuBar является компонентом.

1 Ответ

4 голосов
/ 07 мая 2011

Как обсуждено здесь существует ряд системных ресурсов, которые должны быть явно освобождены в ходе нормальной работы JVM.Метод dispose() графического контекста является одним примером;метод родительского окна dispose() является другим.В любом случае ресурс может быть правильно освобожден, но вы можете наблюдать за кучей до того, как он будет завершен.

Трудно обобщить то, что можно безопасно игнорировать, но один эмпирический подход состоит в том, чтобы реализовать цельпрофайлер.Первые два графика в этом сравнении показывают небольшое, но устойчивое увеличение памяти, используемой определенным методом, который подозревается в сохранении ресурсов.Напротив, на третьей диаграмме показано плоское использование памяти с периодическими всплесками активности по сбору мусора.Ниже приведена типичная схема «зубной» визуально «загруженной» программы, такой как игра .Обратите внимание, что каждый цикл возвращается к базовой линии.

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...