Будет ли элемент собирать мусор, если есть ссылка на его поле?

I.e., in

class A {
    public String s;
}

и

A a1 = new A();
a1.s = "bla";
A a2 = new A();
a2.s = a1.s;
a1 = null;

будет a1 собирать мусор или ссылаться на a1.s, позволяя ему собираться (и я должен сделать глубокую копию, a2.s = new String(a1.s))?

Большое спасибо!

Ответ 1

Если object содержит ссылку другого object, и когда вы устанавливаете ссылку на контейнерный объект null, дочерний элемент или содержащий object автоматически получает право на сбор мусора.

См. эту ссылку для получения дополнительной информации.

Ответ 2

Так как A имеет только reference до s, a2.s, указывающий на a1.s , не повлияет на сбор мусора a1.

i.e a1 имеет право на GC, но объект, на который ссылаются a2.s (или a1.s), не будет иметь права на GC.

Ответ 3

Объект A1 имеет право на GC, поскольку теперь он имеет значение null. Но поскольку String "bla" недоступен для GC, потому что он также упоминается a2.s. Таким образом, для GC доступен только объект a1.

Если это так,

A a1 = new A();
a1.s = "bla";
A a2 = new A();
a1 = null;

тогда как объект a1, так и "bla" доступны для GC. Поскольку все ссылки "bla" удаляются, но теперь дело

a2.s = a1.s;

a2 ссылается на ту же строку "bla". Так что строка доступна в stringpool не для GC

Ответ 4

Здесь вы создаете две ссылки Object A, например a1 и a2.

Сначала вы назначаете значение a1 на a2. Таким образом, после установки значения a2 для GC будет разрешено a1. Но в reference a2 изменений не будет.

Вы также можете проверить этот блог на Сбор мусора: