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