Развертывание jBoss 4.0.2 одной и той же WAR несколько раз приводит к сбою jBoss из-за ошибок PermGem / Out-of-Memory - PullRequest
4 голосов
/ 20 августа 2009

Я разрабатываю веб-приложения и использую jBoss 4.0.2, и когда я несколько раз повторно развернул WAR-файл с помощью eclipse, jBoss вылетит из-за нехватки памяти. И когда мне нужно установить новую версию в производственную среду, она будет потреблять память рабочих серверов, что означает, что мне нужно остановить jBoss, чтобы предотвратить повторное развертывание оперативной памяти с клиентского сервера. Есть ли решение этой проблемы?

Ответы [ 3 ]

5 голосов
/ 20 августа 2009

В основном нет. Из-за того, как работают загрузчики классов JBoss, каждое развертывание будет использовать кусок PermGen, который не будет выпущен, даже если приложение не развернуто.

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

В идеале я бы не использовал горячее развертывание в производственной среде, а просто выключил сервер, заменил WAR / EAR и перезапустил его.

0 голосов
/ 22 августа 2009

Попробуйте это (что относится к Sun's Java):

-XX: + UseConcMarkSweepGC -XX: + CMSPermGenSweepingEnabled -XX: + CMSClassUnloadingEnabled -XX: MaxPermSize = 128m

CMS может на самом деле собирать кучу постоянного поколения (кучу, где находятся ваши классы). Установка MaxPermSize не требуется, но по умолчанию для сервера приложений установлено низкое значение.

0 голосов
/ 20 августа 2009

Я не уверен, что это связано, но я подозреваю, что это так - JBoss не совместим с J2EE настолько, насколько он реализует разделение приложений, как оно поставляется из коробки.

Как оказалось, существует один загрузчик классов, в который помещаются все классы, и, следовательно, невозможно выгрузить классы, и поэтому у вас возникнет эта проблема. Вы можете настроить jboss для большей совместимости с J2EE.

Вы получаете "Permgen с нехваткой памяти" или у вас постоянно с памятью?

Я также добился прогресса, подключив к нему JProfiler и проверив с этим использование памяти.

Я все время просто перезапускал Jboss - не занимал слишком много времени.

...