Нужно ли освобождать компоненты Swing перед тем, как собирать мусор? - PullRequest
2 голосов
/ 26 ноября 2008

Когда я использую внешние ресурсы, такие как файлы или соединение с БД, мне нужно закрыть их, прежде чем я отпущу их.

Нужно ли делать то же самое с компонентами Swing? Если да, то как?

Ответы [ 4 ]

5 голосов
/ 26 ноября 2008

Как правило, вам не нужно избавляться от объектов, когда вы закончите с ними (хотя установка ссылок на них на ноль может позволить им быть GCed быстрее). Однако объекты AWT и Swing выделяют некоторое количество собственных ресурсов, которые необходимо освободить. Кроме того, поток AWT рассматривает окна как объекты верхнего уровня, предотвращая их сборку мусора и завершение JVM.

Таким образом, когда вы закончили работу со своим окном, вам нужно избавиться от него, что освобождает выделенные им собственные ресурсы. Один из способов сделать это - вызвать Window.dispose (). Однако лучшим вариантом было бы вызвать JFrame.setDefaultCloseOperation () при инициализации каждого из ваших корневых окон. Если вы передадите ему DISPOSE_ON_CLOSE, он позаботится о том, чтобы утилизировать себя, когда пользователь закроет окно. Когда закроется последнее такое окно, поток AWT прекратит блокировку и позволит JVM закрыться (при условии, что у вас не запущены другие аберрантные потоки). В качестве альтернативы вы можете передать его EXIT_ON_CLOSE, что заставит ваше окно вызвать System.exit (), который сообщает JVM, что ваше приложение выполнено и изящно завершено.

2 голосов
/ 26 ноября 2008

В какой-то момент вас учили, что вам нужно отключить всех слушателей, потому что в противном случае они действовали бы как ссылки на компонент Swing. Но мне сказали, что это больше не проблема.

0 голосов
/ 26 ноября 2008

Окна (включая диалоги и фреймы) должны быть утилизированы. Если вы создаете (AWT) Graphics объекты, то их также следует утилизировать (но обычно локально в рамках, скажем, метода paintComponent).

Если у вас есть слушатель, который обновляет недолговечную цель из долгоживущего источника, то вы должны удалить ее, прежде чем выбросить цель. Есть хитрый взлом, когда слушатель использует WeakReference для цели, так что он может отменить регистрацию, когда ссылка исчезает (и событие запускается).

0 голосов
/ 26 ноября 2008

Объекты собираются автоматически, если на них нет ссылок. Вам не нужно обращаться с компонентами Swing так же, как с внешними ресурсами. Однако, если у вас есть компонент, который вам больше не понадобится, вы можете установить для любых ссылок на этот компонент значение null.

JPanel p = new JPanel();
p = null;

Установка p в null не удаляет объект, но удаляет все ссылки на объект, поэтому в следующий раз, когда сборщик мусора пройдет, он будет поднят.

Вы должны быть осторожны, хотя другой ссылки на компонент не существует.

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