2010-08-11 5 views
2

Недавно, работая над веб-приложением JSF, используя Netbeans 6.8, я постоянно получаю PermGen: ошибки из памяти. Я также заметил, что это не связано с горячей заменой кода, как это предлагали некоторые люди на форумах; Обычно я перезапускаю свой локальный веб-сервер Tomcat 6.0, когда я передислоцирую код. Раньше это случалось со мной раз в несколько минут, но в последнее время это происходило постоянно. Обычно я не могу пройти более двух минут, прежде чем он сработает.Ошибка отладки Java Netbeans с ошибками памяти

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

Я пробовал все советы, которые я нашел до сих пор, для увеличения параметров памяти JAVA_OPT для Java в Tomcat; Я попытался увеличить доступную память для Netbeans в netbeans.conf. Еще не повезло. Если вы хотите увидеть конкретные изменения конфигурации, которые я сделал, я могу опубликовать это также.

Я также прочитал, что это может быть результатом утечки памяти в Java. Я попытался запустить профилировщик Netbean, но он, как правило, разбился, прежде чем я смог сделать что-нибудь действительно полезное. Кроме того, когда он выполнялся, все распределения объектов с нелепыми поколениями были вещами в java-библиотеках, или примитивы - char [] s были самым большим ядром памяти приложения, например, с самыми большими поколениями.

Мне бы очень хотелось узнать, есть ли у кого-то подобная проблема раньше, и если да, то как они ее решили. Это начинает серьезно препятствовать моей способности выполнять мою работу.

Спасибо за любую помощь.

+0

Отображается netbeans.conf ** - J-XX: PermSize = 32m -J-XX: MaxPermSize = 200m **? – JoseK

+0

У меня был этот набор ранее с тем же значением, 1024 м. Я изменил ваше предложение, установив его на 256 и 512 соответственно. Теперь он падает по-разному. В то время как он сразу же взорвался с ошибкой PermGen, теперь он обычно просто зависает, а иногда я получаю фактическую ошибку, и в других случаях он просто вешает бесконечно. – Lee

+0

Сначала вам понадобится куча кучи, чтобы идентифицировать протекающие объекты и те, которые удерживают их в живых. Как только вы это узнаете, вы можете сразу решить проблему (если она достаточно проста, и вы знакомы с кодом, в котором находится виновник) или использовать профилировщик, чтобы определить места распределения утечек. Вы можете использовать jmap или visualvm (jvisualvm) для получения дампа кучи. Для анализа вы также можете использовать visualvm, но, конечно, вы можете выбрать любой инструмент, который вам нравится - например. MAT, если вы хотите придерживаться бесплатных инструментов. –

ответ

2

добавить эту запись в catlina.sh (или летучей мыши), он работал на меня

JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 
    -server -Xms1536m -Xmx1536m 
    -XX:NewSize=256m -XX:MaxNewSize=512m -XX:PermSize=512m 
    -XX:MaxPermSize=512m -XX:+DisableExplicitGC 
+0

Спасибо, я возился с этими настройками в Netbeans при отладке приложения tomcat, пока ваш вопрос не заставил его все щелкнуть. Спасибо за Ваш ответ. – Zoidberg

+0

@ Zoidberg: приветствуется. –

0

Что-то я нашел полезным для отслеживания утечек памяти без использования профилировщика или отладчик использовать «jmap -histo "(поставляется с jdk). Сохраните вывод этой программы в файл. Запускайте это каждые несколько минут, пока приложение работает. Собирайте выходы и ищите объекты, которые всегда увеличиваются по количеству и размеру. Я даже написал быстрое приложение, чтобы графически отображать выбранные объекты с течением времени, чтобы действительно выделить объекты с удалением, чтобы было легче увидеть, где могут возникнуть утечки.

Смежные вопросы