Jetty 7: OutOfMemoryError: пространство PermGen при повторном развертывании приложения - PullRequest
5 голосов
/ 05 августа 2011

Первое время приложение запускается правильно.Затем я удаляю файл webapp / *. War и вставляю новую версию * .war.Причал начинает развертывание новой войны, но возникает ошибка java.lang.OutOfMemoryError: PermGen space.Как я могу настроить Jetty для исправления ошибки / повторного развертывания?

Это решение мне не помогает.
Версия Jetty: jetty-7.4.3.v20110701

Ответы [ 6 ]

11 голосов
/ 18 сентября 2011

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

Запись в блоге и ее продолжение объяснениевозможный источник проблемы.Всякий раз, когда код контейнера приложения использует класс, который содержит ссылку на один из ваших классов, сборка мусора ваших классов запрещается.Примером из указанной записи в блоге является конструктор java.util.logging.Level:

protected Level(String name, int value) {
    this.name = name;
    this.value = value;
    synchronized (Level.class) {
        known.add(this);
    }
}

Обратите внимание, что known является статическим членом java.util.logging.Level.Конструктор хранит ссылку на все созданные экземпляры.Поэтому, как только класс Level был загружен или создан из кода вашего приложения, сборщик мусора не сможет удалить ваши классы.

Чтобы решить эту проблему, вы можете избежать использования всех классов, которые используются вами самостоятельно.код или убедитесь, что нет ссылок на ваши классы из вашего кода.Обе проблемы могут возникать в любом классе, поставляемом с Java, и поэтому их невозможно исправить в приложении.Вы не можете предотвратить проблему, изменяя только свой собственный код!

Ваши варианты в основном:

  • Увеличение пределов памяти и реже выдает ошибку
  • Анализваш код подробно описан в связанных постах блога и избегайте использования классов, которые хранят ссылки на ваши объекты
7 голосов
/ 15 сентября 2011

Если у PermGen недостаточно памяти, вам нужно перезапустить jvm, в вашем случае перезапустить Jetty.Вы можете увеличить пространство PermGen с помощью опций JVM в связанном решении, так что это произойдет позже (я имею в виду позже: после повторных развертываний).Но это случается время от времени, и вы ничего не можете сделать, чтобы избежать этого.Ответ, который вы связали, хорошо объяснил, что такое PermGenSpace и почему он переполняется.

Использование:

-XX:PermSize=64M -XX:MaxPermSize=128M

или, если этого еще недостаточно

-XX:PermSize=256M -XX:MaxPermSize=512M

Обязательно увеличьте объем пространства, доступного для виртуальной машины, если вы используете эти команды.

use

-Xms128M -Xmx256M
1 голос
/ 17 октября 2014

Для Jetty 7.6.6 или более поздней версии это может помочь http://www.eclipse.org/jetty/documentation/current/preventing-memory-leaks.html.

Мы использовали AppContextLeakPreventer, и это помогло с ошибками OOM из-за пространства permgen

0 голосов
/ 13 марта 2014

Для читателей будущего (относительно того, когда был задан этот вопрос):

В JDK 8 Пермское пространство поколения пропало (больше не существует).Вместо этого теперь есть Metaspace, которое взято из собственного пространства машины.

Если у вас были проблемы с Perm Gen Overflow, то вы можете изучить это объяснение и это комментирует процесс удаления .

0 голосов
/ 17 июля 2012

Очень похоже на Постоянная утечка генерации . Всякий раз, когда ваше приложение оставляло некоторые классы после того, как оно было развернуто, вы получаете эту проблему. Вы можете попробовать последнюю версию Plumbr , возможно, она найдет оставшиеся классы.

0 голосов
/ 17 февраля 2012

У меня та же проблема с HotSpot, но с JRockit, который не имеет постоянного поколения, проблема исчезла.Это бесплатно сейчас, так что вы можете попробовать это: https://blogs.oracle.com/henrik/entry/jrockit_is_now_free_and

...