Как получить AppContext для выпуска компонентов AWT, чтобы их можно было собирать?
Моя команда работает над анализом нашего приложения Swing, чтобы убедиться, что все собирается мусором, когда он больше не используется. Мы сталкиваемся со странной проблемой.
Мы просто открываем новое окно (JFrame
) и закрываю его. Этот кадр содержит EmptyPanel
класс (который содержит короткое сообщение о том, что нет данных) и пользовательский JMeunBar
учебный класс. Мы вообще не взаимодействуем с этим - просто немедленно закройте окно.
Затем мы форсируем сборку мусора и делаем дамп кучи.
После анализа дампа кучи, JMenuBar
не мусор. Его держат открытым от корня GC sun.awt.AppContext
,
Как мы это уберем? Или это то, о чем нам не нужно беспокоиться по какой-то причине? Мы хотим быть усердными, следя за тем, чтобы наше приложение само очищалось, но мы не хотим, чтобы это тоже крутило.
AppContext.mainAppContext
содержит HashMap, который содержит BasicPopupMenuUI.MenuKeyboardHelper
пример. Внутри это ComponentInputMapUIResource.menuInputMap
который имеет это JMenuBar
как компонент.
1 ответ
Как обсуждалось здесь, существует ряд системных ресурсов, которые должны быть явно освобождены в ходе нормальной работы JVM. Графический контекст dispose()
метод является одним из примеров; родительское окно dispose()
метод другой. В любом случае ресурс может быть правильно освобожден, но вы можете наблюдать за кучей до того, как он будет завершен.
Трудно обобщить то, что можно безопасно игнорировать, но один эмпирический подход заключается в использовании цели в профилировщике. Первые два графика в этом сравнении показывают небольшое, но неуклонное увеличение памяти, используемой определенным методом, который подозревается в сохранении ресурсов. Напротив, на третьей диаграмме показано плоское использование памяти с периодическими всплесками активности по сбору мусора. Ниже приведен типичный шаблон для визуально "загруженной" программы, такой как эта игра. Обратите внимание, что каждый цикл возвращается к базовой линии.