Что такое PermSize в Java?

Я просматривал документ в Java Memory Management, и в этом я столкнулся с PermSize, которого я не мог понять. В документе говорится, что он хранит: "JVM хранит свои метаданные", но я не мог точно понять, что имеется в виду под метаданными. Я был googling, и где-то я читал, что он хранит объект value (пользовательский объект).

Какие объекты хранятся там? Пример с объяснением будет большим.

Ответ 1

Быстрое определение "постоянного поколения":

"Постоянное поколение используется для удерживать отражающие данные самой ВМ такие как объекты класса и метод объекты. Эти отражающие объекты распределяется непосредственно в постоянный поколения, и он имеет размер независимо от другого поколений." [ref]

Другими словами, это определение классов (и это объясняет, почему вы можете получить сообщение OutOfMemoryError: PermGen space, если приложение загружает большое количество классов и/или при перераспределении).

Обратите внимание, что PermSize является дополнением к значению -Xmx, заданному пользователем в параметрах JVM. Но MaxPermSize позволяет JVM иметь возможность вырастить PermSize до указанной суммы. Первоначально, когда VM загружается, значение MaxPermSize по-прежнему будет значением по умолчанию (32 МБ для -client и 64 МБ для -server), но на самом деле не будет занимать эту сумму до тех пор, пока она не понадобится. С другой стороны, если бы вы установили BOTH PermSize и MaxPermSize на 256 Мб, вы заметили бы, что общая куча увеличилась на 256 Мбайт до уровня -Xmx.

Ответ 2

Это сообщение в блоге дает хорошее объяснение и некоторый фон. В основном, "постоянное поколение" (размер которого задано PermSize) используется для хранения вещей, которые JVM должна выделять для пространства, но которые не будут (обычно) собираться с мусором (следовательно, "постоянными" ) (+). Это означает, например, загруженные классы и статические поля.

Существует также FAQ по сборке мусора непосредственно от Sun, что отвечает на некоторые вопросы о постоянном поколении. Наконец, здесь сообщение в блоге с большим количеством технических подробностей.

(+) На самом деле части постоянного поколения будут GCed, например. объекты класса будут удалены при разгрузке класса. Но это было необычно, когда постоянное поколение было введено в JVM, отсюда и название.

Ответ 3

Пул управления содержит все, что не относится к вашим данным приложения, а скорее вещи, необходимые для виртуальной машины: обычно он содержит интернированные строки, байтовый код определенных классов, но также и другие "не ваши" части данных.