Одним из утечек памяти, которые я обнаружил в нашем приложении, является приватное статическое поле java.awt.Window.allWindows
, которое отслеживает каждое созданное окно. У нас есть диалоговые окна, которые создаются, используются, а затем забываются, и ожидалось, что они исчезнут и будут собраны мусор. Это частное поле сохраняет их неограниченно, до тех пор, пока на них не будет вызван метод dispose()
. И по определению мы не можем этого сделать, когда они вышли из сферы действия.Зачем вам нужно распоряжаться() java.awt.Window, выходящим за рамки?
Я не понимаю, почему это спроектировано таким образом. Кажется противоречащим духу сборки мусора, чтобы явным образом позволял системе знать, когда я закончил объект Window. Очевидно, я покончил с этим, так как он выходит за рамки.
Я понимаю, что делает метод dispose()
: избавление от системных одноранговых объектов. Я понимаю, что это вне Java и что вам нужно какой-то способ сделать это, и что Swing не должен просто потерять контроль над этими объектами, иначе он будет иметь утечку памяти. Но что делается, сохраняя ссылку на мое Окно навсегда, когда я никогда не буду использовать его снова?
Может кто-нибудь объяснить, почему это необходимо?
Когда вызывается 'removeNotify',' Window' будет удален из 'allWindows'. 'Window' содержат собственные ресурсы и поэтому должны быть удалены так же, как если бы это было соединение с базой данных. –
У меня создалось впечатление, что когда мои подключения к базе данных выходят из сферы действия, они автоматически закрываются.Возможно, я ошибаюсь. :) В настоящее время, хотя, все это для меня управляет сервером, за исключением коротких программ. – skiphoppy