Почему вы должны утилизировать () java.awt.Window, которое выходит за рамки? - PullRequest
9 голосов
/ 10 сентября 2009

Одной из утечек памяти, обнаруженных нами в нашем приложении, является закрытое статическое поле java.awt.Window.allWindows, которое отслеживает все экземпляры Window. У нас есть диалоговые окна, которые создаются, используются, а затем забываются, и ожидалось, что они исчезнут и будут собирать мусор. Это приватное поле сохраняет их в поле действия до бесконечности, пока к ним не будет вызван метод dispose(). И по определению, мы не можем этого сделать, когда они вышли за рамки.

Я не понимаю, почему это так задумано. Кажется, что это противоречит духу сборки мусора, когда я должен явно сообщить системе, когда я закончу с объектом Window. Очевидно, я с этим покончил, так как это выходит за рамки.

Я понимаю, что делает метод dispose(): избавление от объектов одноранговой системы. Я понимаю, что это за пределами Java, и вам нужен какой-то способ сделать это, и что Swing не должен просто терять эти объекты, иначе у него будет утечка памяти. Но что достигается, когда я навсегда сохраняю ссылку на мой Window, когда я больше никогда не буду использовать его?

Может кто-нибудь объяснить, почему это необходимо?

Ответы [ 4 ]

14 голосов
/ 10 сентября 2009

Ненавижу это говорить, но вот как работает GUI.

Окна не блокируют. Это означает, что после создания кода в коде код продолжает выполняться.

Это означает, что ваше Окно, вероятно, выходит из области действия сразу после создания, если вы явно не сохранили ссылку на него где-то еще. На данный момент окно все еще на экране.

Это также означает, что вам нужен какой-то другой способ избавиться от него, когда вы закончите с ним. Введите метод Window dispose(), который можно вызывать из одного из прослушивателей окна.

2 голосов
/ 10 сентября 2009

Это может объяснить это: Проблемы с AWT Threading

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

Я согласен, что это немного круто. Я сам несколько раз сталкивался с этим.

1 голос
/ 12 октября 2013

Метод dispose() уничтожает объект, удерживаемый объектом WindowEvent. Это не убивает приложение / программу.

1 голос
/ 10 сентября 2009

В Java, когда у вас есть собственный код (который является аналогом этих компонентов Windows), вам нужно сохранить ссылку, чтобы сборщик мусора не пытался собирать объект, пока собственные указатели все еще существуют, может вызвать всевозможные неприятности (сбои ВМ и т. д.).

См., Например, обсуждение здесь .

...