Объекты имеют право на GC'ing, когда они больше не достижимы из любого потока.
Объект O доступен из другого объекта A, если либо:
- A имеет ссылку на O, или
- A имеет ссылку на объект, из которого O достижима
Так что, если у вас было: class Foo { Bar x = new Bar(); }
и class Bar { Bar y = new Baz(); }
,
и один из ваших потоков имел экземпляр Foo
, тогда все экземпляры Foo
, Bar
и Baz
были бы доступны и не подходили для GC. (Поток имеет ссылку на экземпляр Foo
, который имеет ссылку на экземпляр Bar
, который имеет ссылку на экземпляр Baz
).
Если затем вы установите x
на null
(или другой объект) в вашем экземпляре Foo
, ни экземпляры Bar
, ни Baz
не будут доступны. (Поток по-прежнему имеет ссылку на экземпляр Foo
, а экземпляр Bar
имеет ссылку на экземпляр Baz
, но экземпляр Foo
больше не содержит ссылку на экземпляр Bar
). Поэтому оба экземпляра Bar
и Baz
будут иметь право на GC.