Что такое 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
Пул управления содержит все, что не относится к вашим данным приложения, а скорее вещи, необходимые для виртуальной машины: обычно он содержит интернированные строки, байтовый код определенных классов, но также и другие "не ваши" части данных.