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

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

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

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

Благодарю.

Существует статическая ссылка на синглтон, поэтому он не будет иметь права на garbage collection до тех пор, пока classный загрузчик не будет допущен к сбору мусора.

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

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

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

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

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

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

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

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

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

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

Давайте будем гением компьютера.