В Java собирается мусор в пространстве постоянного поколения? - PullRequest
35 голосов
/ 26 сентября 2010

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

Ответы [ 2 ]

33 голосов
/ 26 сентября 2010

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

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

30 голосов
/ 22 марта 2011

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

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

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


UPDATE

Начиная с Java 8, permgen больше не существует: Устранение PermGen в JDK 8

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...