Собираются ли связанные списки GC, когда первый элемент списка недоступен?
У меня есть двусвязный список объектов:
class MyObject {
MyObject previousObject;
MyObject nextObject;
// Other fields and methods
}
Только первый объект такого списка непосредственно хранится в приложении, остальные объекты доступны через этот первый объект и временно используются в приложении (но постоянные ссылки не хранятся вне самого списка).
Когда человек больше не обращается к объекту, он собирается сборщиком мусора.
Но мне было интересно, так ли это на самом деле, потому что на (первый) объект все еще ссылается "следующий объект" в связанном списке? И что относительно остальной части списка, эти объекты также собраны (даже если на них ссылаются друг друга)?
Примечание. Я знаю, что могу удалить все ссылки в списке, если я больше им не пользуюсь. Но это "сложно" из-за характера приложения и приводит к дополнительным (ненужным?) Накладным расходам.
3 ответа
GC не использует подсчет ссылок, поэтому круговые зависимости обрабатываются просто отлично. Вам не нужно ничего делать, и весь список будет собираться мусором, когда ни один элемент списка больше недоступен.
Если ни один из объектов в связанном списке не связан ни с одним живым корнем, будет собран весь список. Смотрите, каковы корни?
Критическим моментом является то, что первый цикл сбора мусора собирает ссылки на все достижимые объекты. Затем он отбрасывает все остальное. Таким образом, он может обрабатывать циклические ссылки и огромные само-ссылочные структуры, такие как деревья, без дополнительной работы.
Очевидно, что это намного сложнее, чем это.
Интересно, что - в вашем сценарии, когда первый элемент в списке недоступен, но, кроме того, если третий элемент был доступен, то, если он был LinkedList
первые два предмета будут отброшены. С ArrayList
однако - предыдущие элементы, вероятно, останутся.