Различные варианты решения проблем PermGen - PullRequest
10 голосов
/ 26 июля 2010

Я изучаю различные варианты сборки мусора на виртуальной машине Java 6 18 и хотел бы получить несколько указателей.

Мы запускаем наше приложение на JBoss, и время от времени возникают повторяющиеся ошибки PermGen при повторных развертываниях. В Интернете много противоречивой и устаревшей информации о том, как лучше решить эту проблему или смягчить ее.

Из что я вижу , верно следующее:

  • Опции VM сами по себе не решат эту проблему , только отложите ее.
  • Единственный надежный способ решить эту проблему - это исправить ошибки кодирования либо на самом Сервере приложений (маловероятно), либо в коде (нашем коде или сторонних библиотеках), работающем на Сервере приложений (скорее всего). Заполнение Permgen часто является результатом ссылок из объектов, загруженных загрузчиком классов приложения, на объекты, загруженные загрузчиком классов сервера приложений, что предотвращает сборку мусора загрузчиком классов приложения.

У меня есть два вопроса, вытекающих из этого:

  1. Правильно ли это?
  2. Где параметры VM CMSClassUnloadingEnabled и CMSPermGenSweepingEnabled входят в это? Из того, что я вижу, CMSClassUnloadingEnabled заменяет или неявно включает CMSPermGenSweepingEnabled. Кто-нибудь из них помогает с вышеуказанной проблемой?

Ответы [ 2 ]

7 голосов
/ 26 июля 2010

К сожалению, ответы:

  1. Да
  2. Эти параметры виртуальной машины только отложат проблему.

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

Либо отказаться от горячего повторного развертывания на рабочих серверах или чаще перезапускать веб-контейнер (например, JBoss).

1 голос
/ 26 июля 2010

Длинное, но хорошее чтение: http://victor -jan.blogspot.com / 2010/05 / classloader-leaks-dreaded.html Короче говоря, это разрешимо.Не просто, но решаемо.

...