В Java собрано мусор пространства постоянного поколения?

Я читал, что пространство Perm gen (или Permanent Generation) не собирает мусор. Тем не менее, в коллекции CMS я вижу, как некоторые классы разгружаются в моем журнале GC. Так что мусор Perm gen собран во время полной коллекции или коллекции CMS?

Ответ 1

PermGen - это мусор, собранный, как и другие части кучи.

Следует отметить, что PermGen содержит метаданные классов и объекты, то есть указатели на остальную часть кучи, где выделены объекты. PermGen также содержит Class-loaders, которые необходимо уничтожить вручную в конце их использования, оставаясь в памяти, а также сохранить ссылки на свои объекты в куче. "Представление постоянного поколения" статья Джона Масамицу на веб-сайте Sun/Oracle может помочь вам.

Ответ 2

В современных JVM поколениях, пермен действительно собирается, как и другие части кучи. На странице visualgc указано, что она собирается вместе со старым поколением.

В более старых JVM это, по-видимому, не всегда было так. Например, на Java 5 сборщик CMS, по-видимому, не собирал permGen по умолчанию: вы можете включить его с помощью -XX:+CMSPermGenSweepingEnabled. Я также вспоминаю, что некоторые действительно старые JVM вообще не реализовали сборку пергенов, хотя я не могу найти надежный источник для этого... ermm... "factoid".

Другим моментом является то, что многие люди неправильно объясняли исключения OutOfMemoryError: permgen, чтобы пермь не собирался вообще. Реальность другая. Наиболее распространенной причиной этих OOME является коварный тип утечки памяти, который проявляется, когда вы загружаете код в исполняемую JVM. Утечка происходит потому, что, когда экземпляр какого-либо старого класса, который был заменен, остается доступным. Это приводит к достижению класса объекта, что приводит к достижению класса classloader, что приводит к достижению всех старых классов вместе с их объектами кода, их строковыми литералами и их статическими кадрами и статическими. Многие из этих просочившихся объектов живут в пространстве перггена.


UPDATE

По состоянию на Java 8, permgen больше не существует: Исключение PermGen в JDK 8