Работает ли круговой GC на карте? - PullRequest
2 голосов
/ 26 октября 2011

У меня есть объект User, который строго относится к объекту Data.

Если я создам Map<Data, User> (с Guava MapMaker) со слабыми ключами, такой ключ будет толькоудаляется, если на него больше не ссылаются.Однако объект User, на который он отображается, всегда ссылается на него, который, в свою очередь, удаляется с карты только при удалении ключа данных, т. Е. Никогда, если только определение круговой ссылки GC также не работает при пересечении карты (надеюсь,Вы понимаете, что я имею в виду: P)

Будут ли сборщики мусора User s + Data s, если они больше не используются в другом месте приложения, или мне также нужно указать слабые значения?

Ответы [ 2 ]

4 голосов
/ 26 октября 2011

GC не обнаруживает циклические ссылки, потому что в этом нет необходимости.

Используемый подход состоит в том, чтобы сохранить все объекты, на которые имеются сильные ссылки из корневых узлов, например стеки потоков.Таким образом, объекты, не доступные сильно (с круговыми ссылками или нет), собираются.

РЕДАКТИРОВАТЬ: Это может помочь объяснить "миф"

http://www.javacoffeebreak.com/articles/thinkinginjava/abitaboutgarbagecollection.html

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

Это интересная ссылка http://www.ibm.com/developerworks/library/j-jtp10283/

0 голосов
/ 26 октября 2011

В документации вы видите: weakKeys () Указывает, что каждый ключ (не значение), хранящийся на карте, должен быть заключен в WeakReference (по умолчанию используются сильные ссылки).

, поскольку он является слабым ссылочным, он будет собран.

http://guava -libraries.googlecode.com / SVN / багажник / Javadoc / COM / Google / общие / собирать / MapMaker.html

...