2012-01-19 4 views
3

Я знаю, что GC собирает объекты, у которых нет ссылок, указывающих на объект, но что происходит в случае объектов-слушателей?Как GC знает, когда собирать объект?

Предположим, у вас есть AnimationDelegate, который прослушивает данные от DataSupplier. Когда DataSupplier получает данные и отключает это событие до AnimationDelegate, делегат затем аннулирует (/ update/redraw и т. Д.) A Graphic. Теперь скажите, что экран отключен, удален или, с помощью различных средств, графику больше нельзя рисовать и собирать. AnimationDelegate по-прежнему зарегистрирован на DataSupplier. Как ГК знает, чтобы собрать его? Следует ли отменить регистрацию делегата в графике finalize()?

+0

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

+0

@aroth это не так. – alf

+0

Фактически это зависит от реализации. Я помню, что некоторые по-прежнему используют подсчет ссылок, но я не думаю, что GC, который поставляется с JVM HotSpot, делает это. –

ответ

3

Я боюсь, что ответ не соответствует формату :) Начните с this article Брайана Гетца: он отличный человек, чтобы читать, если вы заинтересованы в GC.

В принципе, как только объект недоступен из активных потоков, он собирается. Фактические алгоритмы варьируются даже в пределах одной JVM, но точка остается той же: что недоступно для мусора. То, что доступно, - это не мусор. Легко.

GC не будет собирать Graphic в вашем примере, как это достижима из AnimationDelegate, который, в свою очередь, является достижимым (по подписке) от DataSupplier который должен быть доступен из некоторого активного потока. Поэтому ответ будет следующим: ваши предположения ошибочны; GC ничего не собирается собирать здесь.

Чтобы ответить на ваш вопрос, отпишитесь на все, что вам не нужно.

Как @rfeak правдиво говорит, finalize() - это большой нет-нет. Практически невозможно использовать его правильно, и слишком легко использовать его неправильно. Тем не менее, все в порядке использовать его в качестве резервного решения, когда вам нужно освободить ресурсы. Но в целом ваша заявка должна быть в состоянии работать нормально, даже если finalize() никогда не будет вызван.

0

Он будет знать только, удалили ли вы ссылки (вытолкнули их).

Однако не делайте этого при завершении(). Финализировать плохо плохо. Для очистки объектов-слушателей (наблюдателей) должны быть доступны другие методы жизненного цикла.

Кстати, шаблон наблюдателя печально известен тем, что он создает утечки памяти, поскольку GC не может собираться из-за затяжных ссылок.

+0

Вот что я понял (хотя тайно надеялся, что я ошибся ...). Я сижу здесь, работая над моим рисунком, и эта мысль пришла мне в голову. – AedonEtLIRA

+0

@amit Помогите объяснить? – AedonEtLIRA

+2

Первое утверждение кажется не совсем верным, java gc может обрабатывать округлость в ссылках, в то время как наивная модель «она будет знать только, если вы их заглушаете» не может. Предположим, у вас есть модель со ссылками внутри нее. Предположим, что у вас есть объект A с полем, ведущим к объекту B и наоборот. Если ни один из них не доступен из вашей программы, они будут собирать мусор, хотя их ссылки не были обнулены. Хотя я мог бы упустить точку вопроса здесь: \ – amit

2

Все зависит от используемой вами JVM и GC. В большинстве GC по умолчанию из JDK используются так называемые «трассирующие коллекторы», которые просто начинаются с заданного корня набора объектов и трассируют все объекты, доступные из этого набора. Все остальные объекты в памяти рассматриваются как мусор и удаляются. Таким образом, круговые ссылки не являются проблемой, если только один из объектов не доступен из набора корней.

Что представляет собой набор корневых объектов? Хорошо, если память обслуживает правильные корни, можно найти в: регистрах программ, локальных переменных в стеке каждого потока и статических переменных.

Чтобы узнать, будут ли ваши объекты GC'd, мы будем знать больше о дизайне вашего приложения.

@Edit: О, и я почти забыл: http://java.sun.com/j2se/reference/whitepapers/memorymanagement_whitepaper.pdf Это довольно хороший обзор того, как все это работает.

Смежные вопросы