Различные варианты решения проблем PermGen

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

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

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

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

У меня возникает два вопроса:

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

Ответы

Ответ 1

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

  • Да
  • Эти параметры VM только отложит проблему.

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

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