В JVM текущего поколения permgen действительно собирается, как и другие части кучи. Страница visualgc утверждает, что она собирается вместе со старым поколением.
В старых JVM это было, очевидно, не всегда так. Например, в Java 5 сборщик CMS , по-видимому, не собирал permGen по умолчанию: вы можете включить его с помощью -XX:+CMSPermGenSweepingEnabled
. Я также вспоминаю, что слышал, что некоторые действительно старые JVM вообще не реализовали сборку permgen, хотя я не могу найти надежный источник для этого ... ммм ... "фактоида".
Другой момент заключается в том, что у многих людей неправильно приписывается исключение "OutOfMemoryError: permgen" для permgen, которое вообще не собирается. Реальность другая. Самая частая причина этих OOME - коварная утечка памяти, которая проявляется при горячей загрузке кода в исполняющуюся JVM. Утечка происходит потому, что когда экземпляр некоторого старого класса, который был заменен, остается достижимым. Это делает класс объекта доступным, что делает доступным загрузчик классов, что делает достижимыми все старых классов вместе с их объектами кода, строковыми литералами и статическими фреймами и статичный. Многие из этих утечек живут в постоянном пространстве.
UPDATE
Начиная с Java 8, permgen больше не существует: Устранение PermGen в JDK 8