Как уже упоминалось, вы, вероятно, испытываете утечку классов загрузчиков. По какой-то причине ваши классы не выгружаются. Это может произойти по двум причинам
- Объекты указанных классов все еще существуют в куче, объекты всегда ссылаются на их класс, или
- На загрузчик классов ссылаются где-то, по какой-то причине загрузчики классов ссылаются на свои классы, чтобы не загружать их дважды
Там нет всеобъемлющего решения этой проблемы. Одним из полезных инструментов, который поможет вам найти основную причину, является Eclipse Memory Analyzer Tool , который вы можете применить к дампу кучи из вашей JVM (вы можете включить дампы кучи в OOM с помощью опции -XX: + HeapDumpOnOutOfMemoryError). Возможно, начните искать объекты java.lang.Class в вашем веб-приложении, чтобы понять, почему они остаются живыми. К сожалению, PermGen обычно не является частью дампа кучи JVM, поэтому вы можете только попытаться найти коррелирующие артефакты в остальной части кучи (объекты класса не хранятся в PermGen, если я не ошибаюсь, только действительный байт-код, пожалуйста, поправьте меня, если я ошибаюсь).
НТН.
Редактировать:
Дейв Чейни в комментарии предполагает, что java.lang.Class-объекты действительно являются частью PermGen и не включены в обычный дамп кучи горячей точки. Если у вас нет JVM, которая записывает эту информацию в дамп кучи, вам потребуется другой подход. Вы по-прежнему можете искать экземпляры своих объектов, но если вы пропускаете классы / загрузчики классов (они, к сожалению, подразумевают друг друга), вам, вероятно, нужно искать другие признаки (объекты метаданных из JBoss и т. Д.).
Основная причина - ссылки на классы, которые были отброшены, просачиваются за пределы их загрузчика классов, не позволяя JVM выгружать эти классы из разрешения. Эти флаги, которые вы используете, могут привести к агрессивной очистке JVM классов, которые не могут быть выгружены, но это не решит основную проблему.
Существует хорошая, abeit комплекс объяснение здесь
источник
Причиной ошибки PermGen OutOfMemory является повторное развертывание приложения. Основная причина - утечка объектов класса в PermGen из повторных развертываний.
Конечно, обходной путь должен перезапустить JVM после определенного числа повторных развертываний.
Это очень сложная проблема, которую нужно полностью решить, хотя с некоторыми трудностями вы можете добиться значительных улучшений. Вот где вы начинаете: Когда ваше веб-приложение остановлено, убедитесь, что:
Это некоторые из вещей, которые могут вызвать захват объекта Class в PermGen.
Также обратите внимание, что не все JVM (или все версии JVM) будут объектами GC Class в PermGen. Если вы используете JVM или версию JVM, которая не будет объектами GC Class в PermGen, тогда ваш единственный выбор - перезапустить JVM после определенного числа повторных развертываний. Это, вероятно , не относится к вам, учитывая упомянутые вами параметры JVM.
источник