Как помешать GC собирать слабо ссылочные объекты? - PullRequest
1 голос
/ 31 мая 2011

У меня есть кеш объекта, который внутренне использует слабые ссылки, и иногда мой объект получает GCed, даже если он мне все еще нужен (поэтому его нужно перезагрузить снова). Моя идея состоит в том, чтобы предотвратить сборщик мусора, добавив еще одну ссылку на этот объект:

Object obj = Cache.getObject(key);
  1. Является ли obj сильным или слабым реф?

  2. Кажется, это работает в моем случае, но я не уверен, что это правильный путь, поэтому я был бы признателен за любое предложение.

p.s. Я не могу изменить реализацию Cache.

Ответы [ 3 ]

2 голосов
/ 31 мая 2011

Как только ваша строка Object obj = Cache.getObject(key) выполнена, объект, на который ссылается obj, теперь строго ссылается и не будет собирать мусор (но когда obj выходит из области видимости, указанный объект может получил право на сборку мусора).

2 голосов
/ 31 мая 2011

obj - нормальная (т. Е. Сильная) ссылка.

Объект не будет иметь права на GC, пока переменная obj достижима.Итак: да, это предотвратит сбор объекта.

1 голос
/ 30 июля 2011

Если вы не хотите, чтобы что-то получалось в GC, вам следует иметь к нему сильную ссылку. Если на производительность части кода отрицательно повлияет исчезновение объектов за микросекунду, в течение которой последняя сильная ссылка была признана недействительной, этот код следует считать поврежденным.

Основное место, где слабые ссылки важны, - это ситуации, когда у объекта есть ссылка на что-то, о чем он на самом деле не заботится, но который он должен обновлять или наблюдать, если есть другие объекты, которые заботятся об этом. , Например, монитор сокетов может взять все входящие пакеты и поместить их в очередь, чтобы окно журнала пакетов могло их вытащить и отобразить. Если объект, который должен считываться из очереди, исчезнет без уведомления монитора сокетов, а у монитора сокетов будет сильная ссылка на очередь, он может продолжать добавлять пакеты в очередь, даже если никто не будет заинтересован в их чтении. Однако если монитор сокетов использует WeakReference для очереди, то в какой-то момент после исчезновения объекта, который должен был считываться из очереди, очередь станет пригодной для сбора мусора (поскольку монитор сокетов будет содержать только слабую ссылку). После того, как очередь была собрана, сборщик мусора мог заметить, что ее WeakReference был признан недействительным, и мог отключиться.

...