Как сборка мусора работает с объектами сбора? - PullRequest
0 голосов
/ 08 июля 2011

Мне интересно, как GC работает с объектами, хранящимися в объектах коллекции, таких как ArrayList или Hashtable.

У меня есть этот ArrayList.

ArrayList<Person> persons = new ArrayList<Person>();
persons.add(new Person("smith"));
persons.add(new Person("john"));
persons.add(new Person("harry"));
persons.add(new Person("nathan"));

Предположим, что на людей все еще ссылается другой объект, но на один из объектов Person, хранящихся в персонах ArrayList, нет ссылок.

Когда GC запускается и ищет объекты, на которые нет ссылок, собирается ли он собирать мусор для объекта Person, на который нет ссылок, или пропускать весь объект Person, потому что на этот объект по-прежнему ссылается другой объект?

Любой ответ приветствуется.

1 Ответ

3 голосов
/ 08 июля 2011

На все объекты Person, хранящиеся в ArrayList, ссылается сам ArrayList, поэтому до тех пор, пока вы сохраняете ссылку на ArrayList, существует косвенная ссылка на каждый объект Person. ГК его не трогает.

Если вы хотите, чтобы GC собирал эти заблудшие объекты Person, вы можете использовать WeakReference для Person в ArrayList вместо Person.

...