Ответ 1
Если объект B и объект C теперь были собранный сборщиком мусора?
Да. Ну, они являются кандидатами на сбор, потому что нет возможности достичь объектов B и C через корень, который является A.
Мне было интересно, как сборщик мусора в Java имеет дело со следующей ситуацией.
Объект A имеет ссылку на объект B, а объект B имеет ссылку на объект C. Основная программа имеет ссылку на Object A. Таким образом, вы можете использовать Object B через Object A и Object C через Object B через Object A.
Что происходит с объектами B и объектом C, если для ссылки между объектом A и объектом B установлено значение null?
Если объект B и объект C теперь собираются сборщиком мусора? Я имею в виду, что между объектом B и объектом C все еще существует связь.
Если объект B и объект C теперь были собранный сборщиком мусора?
Да. Ну, они являются кандидатами на сбор, потому что нет возможности достичь объектов B и C через корень, который является A.
Да, B и C имеют право на сбор мусора, если они не могут быть получены из любого GC-корня (корни GC обычно являются целыми и все ссылки в стеке).
Вы не можете рассчитывать на сборщик мусора для работы в определенное время, поскольку его поведение непредсказуемо, все, что вы можете сказать, состоит в том, что объекты B и C имеют право на сбор мусора
Как обычно, эта статья является обязательным для всех, кто хочет понять, что делает сборщик мусора. Он хорошо написан и имеет пояснительные чертежи.
Фактически, сборка мусора в java - это очень сложная вещь, гораздо больше, чем в интерпретаторе Ruby, в качестве примера.
Во всяком случае, теоретическая основа одинакова.
GC идентифицирует графики объектов, которые не достижимы по программному коду (это означает, что у них больше нет ссылки в активном коде). Когда речь идет о графе объектов, я точно говорю о графе объектов B- > C. когда он недоступен, он может быть GC'ed, но вы не можете сказать, когда это произойдет, из-за того, что GC пытается максимально оптимизировать свою работу, чтобы избежать замедления приложения.
B и C удовлетворяются за сбор мусора, потому что вы больше не можете обращаться к ним. С непредсказуемостью сборщика мусора, который мы знаем, они, скорее всего, собираются в какой-то момент в будущем.
Я думаю, что логика другая. Если объект недоступен из потока, его можно собрать.
Если ссылка на объект отсутствует, тогда для GC будет полезно продолжить
B
не ссылается на него, поэтому сначала будет собирать мусор, тогда он поймет, что C
не имеет к нему ссылки, поэтому C
будет собираться мусором. Это для иллюстрации, Jvm достаточно умен, чтобы выкапывать их в одну развертку.