Как Java Permgen соотносится с размером кода

Я много читал об управлении памятью Java, сборке мусора и т. Д., И я пытаюсь найти наилучшие настройки для моей ограниченной памяти (1,7 г на небольшом экземпляре ec2). Мне интересно, существует ли прямая корреляция между мой размер кода и настройка permgen. По словам Солнца:

Постоянное поколение является особенным, потому что оно содержит данные, необходимые виртуальной машине для описания объектов, которые не имеют эквивалентности на уровне языка Java. Например, объекты, описывающие классы и методы, хранятся в постоянном поколении.

Для меня это означает, что он буквально хранит мои определения классов и т. Д.... Означает ли это, что существует прямая корреляция между размером моего скомпилированного кода и настройкой, которую я должен установить? Мое приложение занимает около 40 МБ, и я заметил, что мы используем 256 МБ permgen. Я думаю, может быть, мы используем память, которая может быть лучше выделена для динамического кода, такого как экземпляры объектов и т.д...

2 ответа

Решение

Ваш Tomcat настроен на автоматическое повторное развертывание приложений, которые были сброшены в папке приложений? Вы используете эту функциональность?

Если вы используете эту функциональность, есть вероятность, что объем памяти, используемой в пространстве PermGen, увеличится. Это может произойти из-за (плохо написанных) приложений, которые каким-то образом поддерживают ссылки на загруженные классы. Каждый раз, когда происходит повторное развертывание, объем памяти, используемой в пространстве PermGen, будет увеличиваться до тех пор, пока он не переполнится.

Если вы не используете эту функциональность и всегда используете одно и то же приложение на сервере Tomcat, то я просто попробую запустить Tomcat с настройками по умолчанию для пространства PermGen. Если приложение загружается и какое-то время работает нормально, то все должно быть в порядке. Если приложению не хватает пространства PermGen, просто увеличивайте его пошагово, пока пространство PermGen не станет достаточно большим.

Почему он был настроен на 256 м (как видно из вашего другого вопроса)?

Между прочим, есть корреляция между количеством загруженных классов и количеством необходимого пространства в области PermGen. Так что, да, чем больше загруженного кода, тем больше места в PermGen вам понадобится.

Sun говорит, что permgen - это хранилище для объектов, которые не имеют эквивалента в языке Java:

Третье поколение, тесно связанное с постоянным поколением, является постоянным поколением. Постоянное поколение является особенным, потому что оно содержит данные, необходимые виртуальной машине для описания объектов, которые не имеют эквивалентности на уровне языка Java. Например, объекты, описывающие классы и методы, хранятся в постоянном поколении.

Так что да, постоянное поколение содержит "внутренние" структуры данных JVM, которые, помимо прочего, описывают объекты и методы. 256 МБ может быть довольно большим, но это будет зависеть от приложения.

В большом приложении ColdFusion, которое я запускаю, создается огромное количество классов для кода ColdFusion, который компилируется на лету, и я работаю с постоянным поколением, установленным на 192 МБ. Я думаю, что раньше я успешно запускал его на 128 МБ, так что вы определенно можете поэкспериментировать с ним.

Если вы измеряете производительность под нагрузкой до и после настройки этих параметров ГХ, вы сможете определить, как ваши изменения влияют на производительность вашего приложения.

Кроме того, документ, на который я ссылаюсь, дает много информации о том, как JVM управляет своей памятью - это довольно хорошее чтение.

Другие вопросы по тегам