Как работает сборка мусора в Java? - PullRequest
11 голосов
/ 12 марта 2010

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

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

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

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

Ответы [ 9 ]

9 голосов
/ 12 марта 2010

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

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

6 голосов
/ 12 марта 2010

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

4 голосов
/ 12 марта 2010

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

4 голосов
/ 12 марта 2010

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

2 голосов
/ 12 марта 2010

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

2 голосов
/ 12 марта 2010

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

Во всяком случае, теоретические основы одинаковы.

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

1 голос
/ 12 марта 2010

Если нет ссылки на объект, то для ГХ будет целесообразно продолжить

1 голос
/ 12 марта 2010

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

0 голосов
/ 12 марта 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...