Когда сборщик мусора сотрет экземпляр объекта, использующего шаблон Singleton? - PullRequest
29 голосов
/ 08 ноября 2010

Когда сборщик мусора сотрет экземпляр объекта, использующего шаблон Singleton?

Объект болтается дольше обычного?

Как вручную принудительно удалить / собрать мусор объекта в Java?

Спасибо.

Ответы [ 4 ]

42 голосов
/ 08 ноября 2010

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

Вы не можете заставить любой объект собирать мусор; Вы можете запросить , что сборщик мусора работает с System.gc(), но это всего лишь запрос.

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

6 голосов
/ 08 ноября 2010

Если вы сохраняете статическую ссылку на него в своем синглтон-классе, то счетчик ссылок не может упасть до 0 и, следовательно, никогда не должен собираться.

4 голосов
/ 15 января 2015

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

Класс Singleton имеет статическую ссылку на созданный экземпляр объекта singleton, и поэтому он никогда не будет собирать мусор, если, конечно, Джон Скит не заявил, что контекст, который загрузил этот класс (загрузчик классов), сам по себе подходит для сборки мусора, и в этом случае статическая ссылка больше не будет корнем GC.

Соответствующий ответ здесь .

Я думаю, что это была ошибка до Java 1.2, когда экземпляр singleton мог собирать мусор, если не было глобальной ссылки на него, но это было исправлено в Java 1.2, и только теперь он может быть пригоден для сборки мусора, если класс Загрузчик, который загрузил этот класс, был собран сборщиком мусора.

0 голосов
/ 18 апреля 2016

static поля могут и действительно получать GCed, однако в простом приложении этого не происходит.

На статические поля ссылается Class, а на Class ссылается ClassLoader.На ClassLoader ссылается каждый класс и каждый экземпляр этого класса.

Однако в контейнерах OSGi и серверах приложений нередко отбрасывать каждую ссылку на приложение или библиотеку и ее загрузчик классов.На этом этапе загрузчик классов и каждое статическое поле могут быть GC-ed.

...