Как Сборщик "мусора" Java обрабатывает самоссылку?

Ну, надеюсь, у тебя есть ответ. Если нет, вы можете попробовать посмотреть в режиме отладки. подкласс B имеет доступ как к intVal. Они не являются полиморфными, поэтому они не переоцениваются.

Если вы используете ссылку B, вы получите intVal B. Если вы используете ссылку A, вы получите intVal. Это так просто.

22
задан Scott Dorman 11 February 2009 в 20:53
поделиться

6 ответов

Сборщики "мусора", которые полагаются только на подсчет ссылок, вообще уязвимы для сбоя к набору самосправочные структуры, такие как это. Эти GCs полагаются на количество количества ссылок на объект, чтобы вычислить, достижим ли данный объект.

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

См. также, страница Wikipedia на сборщики "мусора" трассировки .

23
ответ дан jsight 29 November 2019 в 03:53
поделиться

Циклические ссылки являются (разрешимой) проблемой при доверии подсчету ссылок, чтобы решить, мертв ли объект. Никакая реализация Java не использует подсчет ссылок, AFAIK. Более новый JREs Sun использует соединение нескольких типов GC, всей метки-и-развертки или копирования, я думаю.

можно читать больше о сборке "мусора" в целом в Википедия , и некоторые статьи о java GC здесь и здесь , например.

14
ответ дан Bill the Lizard 29 November 2019 в 03:53
поделиться

Фактический ответ на это является зависящим от реализации. JVM Sun отслеживает некоторый набор корневых объектов (потоки и т.п.), и когда это должно сделать сборку "мусора", трассировки, какие объекты достижимы от тех и сохраняют их, отбрасывая остальных. Это на самом деле более сложно, чем это для обеспечения некоторой оптимизации, но это - основной принцип. Эта версия не заботится о циклических ссылках: пока никакой живой объект не содержит ссылку на мертвую, это может быть GCed.

Другой JVMs может использовать метод, известный как подсчет ссылок. Когда ссылка создается к объекту, некоторый счетчик увеличен, и когда ссылка выходит из объема, счетчик постепенно уменьшается. Если счетчик достигает нуля, объект завершен и собрал "мусор". Эта версия, однако, действительно допускает возможность циклических ссылок, которые никогда не собирались бы "мусор". Как гарантия, много таких JVMs включают резервный метод для определения, какие объекты на самом деле мертвы, который это выполняет периодически, чтобы разрешить самоссылки и дефрагментировать "кучу".

7
ответ дан James 29 November 2019 в 03:53
поделиться

Как неответ в стороне (существующие ответы больше, чем достаточны), Вы могли бы хотеть проверить техническое описание на систему сборки "мусора" JVM, если Вы вообще заинтересованы GC. (Любой, просто google JVM Garbage Collection)

я был поражен некоторыми методами, используемыми, и при прочтении некоторых понятий как "Рай", я действительно понял впервые, что Java и JVM на самом деле могли разбить C/C++ в скорости. (Каждый раз, когда C/C++ освобождает объект/блок памяти, код включен... Когда Java освобождает объект, он на самом деле не делает ничего вообще; с тех пор в хорошем коде OO, большинство объектов создано и освобождено почти сразу, это удивительно эффективно.)

современный GC имеет тенденцию быть очень эффективным, управляя более старыми объектами очень по-другому, чем новые объекты, способность управлять GCs, чтобы быть коротким и half-assed или длинным и полным, и большим количеством опций GC могут управлять переключатели командной строки, таким образом, на самом деле полезно знать то, к чему на самом деле относятся все термины.

Примечание: Я просто понял, что это вводило в заблуждение. Выделение СТЕКА C++ очень быстро - моя точка была о выделении объектов, которые в состоянии существовать после того, как текущая стандартная программа закончилась (которому я верю, ДОЛЖНЫ быть все объекты - это - что-то, что Вам не придется думать о том, если Вы собираетесь думать в OO, но в C++ скорость может сделать это непрактичным).

, Если Вы только выделяете классы C++ на стеке, это - выделение, будет, по крайней мере, с такой скоростью, как Java.

5
ответ дан Bill K 29 November 2019 в 03:53
поделиться

Java собирает любые объекты, которые не достижимы. Если ничто иное не будет иметь ссылку на запись, то она будет собрана, даже при том, что она имеет ссылку на себя.

4
ответ дан Dave L. 29 November 2019 в 03:53
поделиться

Просто, Да.:)

Выезд http://www.ibm.com/developerworks/java/library/j-jtp10283/

Все JDKs (от Sun) имеют понятие "достижимости". Если GC не может "достигнуть" объекта, он уходит.

Это не "новая" информация (Ваши первые респондентам являются большими), но ссылка полезна, и краткость является чем-то сладким.:)

2
ответ дан Sam 29 November 2019 в 03:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: