Подтвердить что ты не робот

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

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

Объект висит вокруг больше, чем обычный объект?

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

Спасибо.

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

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

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

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

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

Ответ 4

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

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

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