2009-10-27 4 views
59

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

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

+0

Значение по умолчанию - 64 м для 64-разрядных виртуальных машин. Мы увеличили его до «512 м» для сервера tomcat, на котором запущено 8 рельсовых приложений.'-XX: MaxPermSize = 512m -XX: PermSize = 512m'. Tomcat с множеством определений классов сам по себе нуждается в большом PerSize и с рубином, рубином на рельсах в сочетании с jruby .. огромным PermSize. –

+2

Обратите внимание, что постоянное поколение (и с ним параметры PermSize) уходят в Java 8. Они заменяются «Metaspace». См. Http://javaeesupportpatterns.blogspot.co.uk/2013/02/java-8-from-permgen-to-metaspace.html – sleske

ответ

100

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

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

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

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

9

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

22

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

Существует также FAQ on garbage collection непосредственно от Sun, на котором можно ответить на некоторые вопросы о постоянном поколении. Наконец, вот blog post с множеством технических деталей.

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