Когда сборщик мусора стирает экземпляр объекта, который использует шаблон 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.

Interesting Posts

Как переместить большие файлы с помощью RestTemplate?

Установка .Net Framework 3.5 с пакетом обновления 1 (SP1) для Windows 8 x64 завершается с ошибкой и сбой при 65.8% с кодом ошибки 0x800f081f

Мой компьютер не запускается – он застрял во включенном, выключенном контуре

Слишком много использования памяти

Программа не запускается при входе в систему, так как для нее требуется приглашение UAC

Vim: выбор копии в буфер обмена OS X

Горизонтальная вкладка «и»

Должен ли я использовать data.frame или матрицу?

Как включить mod_rewrite в любой ОС?

INSTALL_FAILED_SHARED_USER_INCOMPATIBLE при использовании общего идентификатора пользователя

Параллельная итерация в C # или счетчике переходов

Просмотр содержимого zip-файла в стиле команды дерева

Cowsay ничего не говорит

Откладывание обновлений в Windows 10 Creators Update (версия 1703)

Может ли x86 переупорядочить узкий магазин с более широкой нагрузкой, которая полностью его содержит?

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