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