PermGen пространство исключение - PullRequest
4 голосов
/ 12 сентября 2011

Я использую JAVA 5 (32 бит) для моего приложения, работающего на JBoss.Но работает нормально только для 32 бит.Когда мы развернем его на 64-битном java5, он выдаст исключение

"java.lang.OutOfMemoryError: PermGen space" exception

Требуется ли какой-либо патч?Требуется ли изменение кода?

Заранее спасибо.

Ответы [ 4 ]

7 голосов
/ 12 сентября 2011

У меня та же проблема, когда я запускаю свое веб-приложение под tomcat или jetty.Постоянная память поколения используется для загрузки классов, и идея заключается в том, что «классы загружаются раз и навсегда».Поскольку я использую довольно много библиотек и Spring Framework, эта память заполняется очень быстро, особенно, когда я несколько раз повторно развертываю веб-приложение без перезапуска контейнера сервлета.

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

-XX:PermSize=128m -XX:MaxPermSize=256m -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled

-XX:MaxPermSize используется для установки максимального значения постоянной генерации.Это должно быть больше размера по умолчанию.

-XX:+CMSClassUnloadingEnabled эта опция используется, чтобы позволить JVM выгрузить класс во время выполнения.По умолчанию выгрузка классов отключена.Для Java 5, пожалуйста, прочитайте this .

-XX:+UseConcMarkSweepGC, чтобы опция загрузки классов работала, эта опция также должна быть установлена ​​( ref )

Кроме того, вы должны рассмотреть возможность обновления версии JVM.Java 5 слишком старая.

3 голосов
/ 12 сентября 2011

64-битная Java имеет в два раза больше указателей, чем 32-битная.Поскольку большинство ваших объектов состоят из указателей (ссылок на другие объекты), вам нужно значительно больше памяти для запуска.Вы запускаете 64-битную версию, потому что ваше приложение требует более 4 ГБ, выделенных в первую очередь, не так ли?Если нет, то лучше использовать 32-разрядную JVM.

Играть с -XX:MaxPermSize= при запуске сервера.

2 голосов
/ 12 сентября 2011

Требуется ли какой-либо исправление?

Да, с использованием 64-битной Java 6 или 7, которая по умолчанию использует 32-битные ссылки.Java 5.0 использует 64-битные ссылки.Я не думаю, что это будет добавлено в Java 5.0, так как она почти два года не поддерживалась свободно.(Вы можете заплатить, чтобы поддержать его BTW)

В JVM Sun / Oracle, объекты выровнены на 8 байтов.JVM использует этот факт для использования 32-битных ссылок для адресации 32 ГБ памяти.(8 * 4G).С прямой и отображенной памятью вы можете использовать более 32 ГБ.

0 голосов
/ 12 сентября 2011

Создайте одну переменную среды со следующими параметрами / значениями:

varible name = JAVA_OPTS

variable value = -Xmx1000M -XX:MaxPermSize=512m
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...