java.lang.OutOfMemoryError: пространство PermGen - PullRequest
11 голосов
/ 12 сентября 2011

Для всех отрицательных / близких избирателей: Я знаю, что это точная копия многих вопросов, но я пробовал много ответов и все еще сталкивался с проблемами, поэтому добавил новый вопрос.

Вопрос: Я использую eclipse-helios и Tomcat 6 для своей весенней заявки и получаю

java.lang.OutOfMemoryError: PermGen space  

КОГДА Я ОТЛАГАЮ МОЕ ПРИЛОЖЕНИЕ

Я пытался
1) Добавление

-vmargs
-Dosgi.requiredJavaVersion=1.5
-Xms512m
-Xmx1024m
-XX:MaxPermSize=1204m
-XX:+UseConcMarkSweepGC
-XX:+CMSClassUnloadingEnabled
-XX:+CMSPermGenSweepingEnabled    

к eclipse.ini
2) Создание setenv.sh и setenv.bat в tomcat_home/bin со следующим содержанием

set JAVA_OPTS="-Xms256m -Xmx512m -XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled"   

3) Ручной сборщик мусора в затмении.Я включил эту опцию с помощью

Window -> Preferences -> General -> and select always run in background and show heap status 

4) Перезапуск Tomcat сто раз.
5) Перезапуск затмения и иногда перезапуск моей машины, когда разочарование выходит за пределы.
Лучшая часть - я все еще получаюошибка.
Есть ли решение, которое я должен попробовать?

РЕДАКТИРОВАТЬ: Я пытался запустить другое приложение и все еще получаю ту же ошибку, ИМХО мое приложение слишком мало, чтобы вызвать ошибку, и мое приложение работает нормально на настройке моих коллег.

Ответы [ 6 ]

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

Ваши первые 3 варианта предназначены для 2 разных JVM.Опции # 1 и # 3 изменяют экземпляр JVM затмения, это JVM, управляющая вашей IDE.Опция № 2 изменяет экземпляр JVM Tomcat.Вот почему вы видите два java.exe файла в вашем диспетчере задач (в случае окон) при запуске eclipse и Tomcat (при условии, что это единственные запущенные Java-приложения).

Важно понимать, что плагины Tomcat предоставляютпо затмению WTP (в моем случае Indigo) не вызывать внешние (зависящие от ОС) сценарии для запуска / остановки Tomcat.Вместо этого они запускают JVM Tomcat напрямую через командную строку (java.exe ...).Если вы хотите изменить параметры JVM для экземпляров Tomcat, которые вы запускаете из затмения, необходимо изменить соответствующий Run Configuration.Попробуйте изменить параметры JVM там, это должно работать (см. Скриншот).enter image description here

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

Попробуйте set JAVA_OPTS=-XX:NewSize=128m -XX:MaxNewSize=256m -XX:PermSize=128m -XX:MaxPermSize=256m -XX:+DisableExplicitGC -Xms512m -Xmx1536m

Постоянное поколение особенное, потому что оно имеет метаданные, описывающие пользовательские классы (классы, которые не являются частью Язык Java). Примерами таких метаданных являются объекты, описывающие классы и методы, и они хранятся в постоянном поколении. Приложения с большой кодовой базой могут быстро заполнить этот сегмент куча, которая вызовет java.lang.OutOfMemoryError: PermGen no независимо от того, насколько высок ваш -Xmx и сколько у вас памяти на машине.

0 голосов
/ 01 декабря 2017

Для меня -Xmx1024m -XX:MaxPermSize=256m сделал свое дело.

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

Я не знаю подробностей о eclipse.ini, но я думал, что это просто установка флагов при запуске самого Eclipse.Без влияния на запуск / отладку приложений.Лично, когда я хочу изменить настройки при запуске / отладке приложения, я просто добавляю флаги JVM в соответствующую конфигурацию запуска / отладки.

Более того, если вы используете пространство с разрешением более 1 гигабайта, я думаю,что-то не так в коде.Попробуйте найти источник потребления пермского пространства и исправить его.Я не говорю, что это будет легко, но это будет необходимо для правильной работы приложения.... за исключением случаев, когда действительно требуется пространство в 1 гига Пермь, но у меня есть некоторые сомнения по этому поводу.

То, что вы можете искать, это, например, string.intern().Если вы будете делать это с каждым запросом / записью / что угодно для произвольных строк, вы будете бесполезно заполнять свой пермский пробел, поскольку он будет постоянно сохранять копию строки.

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

Я бы добавил -XX: PermSize = 1024m в переменную JAVA_OPTS, поскольку ошибка может исходить от Tomcat.Я не знаком с файлом eclipse.ini.

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

Какие инструменты вы использовали для профилирования вашего работающего приложения? Я рекомендую использовать eclipse mat, хотя jconsole и visualvm доступны с jdk. Вы загружаете много классов в своем приложении, где-нибудь в цикле? Как насчет строк? Каков размер пула строк? Извините, но перезапуск tomcat, eclipse или машины не решит проблему; вам нужно будет профилировать и проанализировать вашу заявку, чтобы решить эту проблему. Возьмите дамп кучи (вы можете использовать jmap) и проанализируйте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...