Назад | Перейти на главную страницу

Как java permgen соотносится с размером кода

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

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

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

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

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

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

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

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

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

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

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

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

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

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