2010-03-12 3 views
11

Мне было интересно, как сборщик мусора в Java имеет дело со следующей ситуацией.Как работает сборка мусора в Java?

Объект А имеет ссылку на объект В и объекте В имеет ссылку на объект C. Основная программа имеет ссылку на объект A. Таким образом, вы можете использовать объект В корыте объект А и объект С корытом объект Б прогиб Объект A.

Что происходит с объектом B и объектом C, если ссылка между объектом A и объектом B установлена ​​равной нулю?

Должен ли объект B и объект C собираться сборщиком мусора? Я имею в виду, что все еще существует связь между объектом B и объектом C.

+0

Я задал другой вопрос в другом посте: http://stackoverflow.com/questions/2433261/how-does-garbage-collection-in-java-work-with-classes – JordyOnrust

ответ

9

Должен ли объект B и объект C теперь , собранный сборщиком мусора?

Да. Ну, они являются кандидатами для сбора, потому что нет никакого способа, чтобы добраться до объекта B и C через корень, который А.

4

Вы не можете рассчитывать на сборщик мусора для работы в определенное время, поскольку его поведение непредсказуемо, все, что вы можете сказать, это объекты B и C имеют право на сбор мусора

1

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

6

Да, B и C имеют право на сбор мусора, если они не могут быть доставлены из любого корня GC (обычно для корней GC обычно используются нитки и все ссылки в стеке).

+0

...и все статические переменные –

+3

@Maurice: не знаю, насколько я знаю. статические переменные могут быть достигнуты с помощью класса, к которому они принадлежат, которые могут быть достигнуты через загружаемый ими «ClassLoader», который может быть достигнут через другие классы, которые он загрузил, которые могут быть достигнуты через объекты такого типа. Поэтому, если «ClassLoader» является GCed, вы даже можете потерять значение статической переменной. –

+0

Возможно, вы правы –

1

Если нет ссылки на объект, то он будет пригоден для GC, чтобы продолжить

2

В факт, сбор мусора в java - очень сложная вещь, гораздо больше, чем в интерпретаторе Ruby, в качестве примера.

В любом случае теоретическая основа такая же.

GC идентифицирует графики объектов, которые не достижимы по программному коду (то есть у них больше нет ссылки в активном коде). Когда речь идет о графе объектов, я точно говорю о графе объектов B-> C. когда он недоступен, он может быть GC'ed, но вы не можете сказать, когда это произойдет, из-за того, что GC пытается максимально оптимизировать свою работу, чтобы избежать замедления приложения.

2

B и C являются приемлемыми для сбора мусора, потому что вы больше не можете обращаться к ним. С непредсказуемостью сборщика мусора все, что мы знаем, они, скорее всего, собираются в какой-то момент в будущем.

0

B не имеет никакого отношения к нему, так он будет мусором первым, то он поймет, что C не имеет никакого отношения к нему, так C будет мусор. Это для иллюстрации, Jvm достаточно умен, чтобы выкапывать их в один размах.

+2

Невозможно сказать, что B сначала будет gc'е, т. Е. Вы не должны иметь код финализатора в B и C, который зависит от этого порядка. GC не засчитывает ссылки, а проверяет доступность. Если оба B и C не могут быть достигнуты, они в равной степени недоступны. –

4

Как обычно, этот article является обязательным для чтения для тех, кто хочет понять, что делает сбор мусора. Он хорошо написан и имеет пояснительные рисунки.

+0

Открыв ссылку, мне нужно имя пользователя и пароль. – JordyOnrust

+0

Ах, FTP снова наносит удар. Я редактировал свой пост, с другой ссылкой, которая должна работать лучше. Существует также версия в формате PDF. –

+0

@ Bright010957: Tada! https://ritdml.rit.edu/dspace/bitstream/1850/5112/1/PWilsonProceedings1992.pdf –

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