java.lang.OutOfMemoryError: пространство PermGen (не обычные подозреваемые!)

Ошибка возникает в этой строке на странице jsp!

    <table:table name="sessionScope.users" sort="external" pagesize="50" id="user" class="list" 
    requestURI="/admin-users.html" partialList="true" size="sessionScope.fullListSize">

Я пробовал увеличить perm gen max до 512 м, используя методы, найденные в других сообщениях, как для вызова eclipse, так и для экземпляра Tomcat.

Хорошо, поэтому требуется немного больше контекста: это моя система разработки, работающая в eclipse и указывающая на автономный экземпляр tomcat, который является сервером в Eclipse.

Согласно Повторяющийся PermGen в Tomcat 6, в моем eclipse.ini есть следующее:

--launcher.XXMaxPermSize
512m

// ...

-XX:MaxPermSize=512m
-XX:+UseConcMarkSweepGC
-XX:+CMSPermGenSweepingEnabled
-XX:+CMSClassUnloadingEnabled
-Xms256m


-Xmx512m

person Artyom 108    schedule 24.11.2011    source источник
comment
Не помещайте решенное в заголовки. Просто отметьте принятый наиболее полезный ответ.   -  person BalusC    schedule 24.11.2011
comment
Ну, на самом деле это не было связано ни с одним из ответов ... и я думаю, что РЕШЕНИЕ в заголовках - это хорошая практика ... это противоречит соглашениям SOF ??   -  person Artyom 108    schedule 24.11.2011
comment
Вы можете опубликовать свой ответ, если ни один из ответов не помог в решении проблемы. Это сайт вопросов и ответов. Это не дискуссионный форум. Вопросы, ответы на которые помечены как принятые, отображаются в списке разными цветами, что позволяет распознать их как решенные. Также поисковая система может отличить решенные проблемы (вопросы с принятыми ответами) от нерешенных. Для этого вам не нужно кричать в заголовке «Решено» :) Начните с stackoverflow.com/faq и продолжайте с meta.stackoverflow.com   -  person BalusC    schedule 24.11.2011


Ответы (2)


Хорошо написанное веб-приложение не должно зависать на своем загрузчике классов при повторном развертывании, но есть множество причин, по которым это может быть.

Если вы используете Tomcat, вы можете попробовать это в server.xml:

<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />

На этой странице гораздо больше информации.

person Alastair Maw    schedule 24.11.2011

Вы, вероятно, однажды перенесли слишком много на Tomcat. Откажитесь от Tomcat, и все будет хорошо - пока вы снова не заполните пространство perm gen слишком большим количеством перезапусков.

ОБНОВИТЬ:

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

Все предложения по обнаружению утечек кажутся мне неправильными. Утечки обычно проявляются со временем. Ниже вы сказали, что это происходит при каждом доступе.

Я бы порекомендовал следующее:

  1. Не используйте Eclipse. Если вы развернете WAR вручную и запустите Tomcat, наблюдаете ли вы такое же поведение? Запуск Eclipse может быть неправильным.
  2. Вы можете настроить размер памяти и перманентного пространства. Найдите в Google параметры JVM и посмотрите, как это сделать.
  3. Загрузите Visual VM 1.3.3, установите все плагины и запустите его перед запуском Tomcat. Я позволю вам увидеть, что происходит с вашей памятью в режиме реального времени. Вы также можете увидеть много других полезных вещей, таких как потоки и т. Д. Вам нужно больше данных, а не догадок.
person duffymo    schedule 24.11.2011
comment
это происходит каждый раз, когда я бегу, когда попадаю на эту страницу ... даже при новом запуске затмения. - person Artyom 108; 24.11.2011
comment
Ой. Возможно, вам понадобится помощь профилировщика. Permgen в основном используется определениями классов в загрузчиках классов и интернированных строках. Однако вам нужно ужасно большое приложение, чтобы использовать 512M permgen для классов. - person Alastair Maw; 24.11.2011
comment
Вот о чем я думаю! ... Я использую 64-битный ubuntu 10.04 с большим количеством памяти, так что не обращайте на это внимания, но мне и не должно быть. Кроме того, этого не происходит ни с моим коллегой по Windows, ни с нашим производственным сервером. Для меня это, кажется, началось случайно ... Я вернулся к старому коду, который работал задолго до его запуска, но проблема все равно возникла. Мне интересно, это поврежденная библиотека или что-то в этом роде ... - person Artyom 108; 24.11.2011
comment
Итак, JreMemoryLeakPreventionListener, что он вам на самом деле говорит? - person Artyom 108; 24.11.2011
comment
У меня проблемы с веб-приложениями, но не падает ли Tomcat при перезапуске Eclipse? Или вы развертываете фоновый экземпляр Tomcat, и в этом случае он столкнется с этой проблемой? Попробуйте закрыть Eclipse и посмотреть, сможете ли вы по-прежнему получить: 8080 или что-то еще. Очевидно, что если вы можете, это не поможет - вам нужно перезапустить экземпляр Tomcat. См. Ссылку, которую я опубликовал, чтобы узнать, как все это исправить. - person Alastair Maw; 24.11.2011
comment
См. java-monitor.com/forum/showthread.php?t=818 для получения подробной информации о JreMemoryLeakPreventionListener. - person Alastair Maw; 24.11.2011
comment
Ах хорошо. Спасибо. Я не видел этого. Чтобы ответить на ваш вопрос, это экземпляр tomcat, которым управляет Eclipse. Это происходит каждый раз, когда я запускаю / отлаживаю приложение в eclipse. - person Artyom 108; 24.11.2011
comment
РЕШЕНИЕ (ВИДЫ): JAVA_OPTS = -server -Xmx383m -Xms96m -Xss512k -XX: MaxPermSize = 256m этот ученик должен быть в реальной среде, не в eclipse.ini ... Это было Подсказка: у меня есть приложение, работающее в автономном режиме tomcat, и у меня такая же проблема. Затем от отчаяния я попытался установить параметры глобально, и это сработало. Я предполагаю, что настройки в eclipse ini предназначены только для самого eclipse, и это eclipse запускает tomcat в другом vm. (это моя текущая теория ...) В любом случае, спасибо - person Artyom 108; 24.11.2011
comment
поэтому, чтобы применить изменения в eclipse, который в моем случае указывает на автономный экземпляр tomcat, мне нужно перейти в Run | запустить / отладить конфигурации ..., выберите конфигурацию сервера слева, затем перейдите на вкладку «Аргументы» и введите настройки в поле «Аргументы виртуальной машины». JAVA_OPTS работает для автономного кота (за пределами eclipse), но, по-видимому, не обрабатывается eclipse. - person Artyom 108; 24.11.2011