Куча JVM PermGen не очищается после завершения программы

Я запускаю веб-приложение Java на JBoss и Ofbiz. Когда я выполнил профилирование памяти JVM с помощью VisualVM, я обнаружил, что огромное количество классов и их объектов загружаются в кучу, но не очищаются/выгружаются после завершения работы приложения.

Я понимаю, что JVM выполняет автоматическую сборку мусора, которая должна гарантировать очистку кучи после завершения программы.

JBoss и Ofbiz должны работать постоянно. Но, кажется, чтобы очистить кучу, нам нужно перезапустить все эти приложения и начать заново. Но наше приложение должно работать 24x7.

Подскажите, пожалуйста, в чем тут может быть дело? Я не уверен, что все вещи, которые я должен контролировать, чтобы добраться до корневой проблемы.


person kajarigd    schedule 28.07.2014    source источник


Ответы (1)


Не обязательно. JVM не нужно очищать сразу после выгрузки приложения. Он будет очищаться только тогда, когда это необходимо или когда он простаивает (в зависимости от используемого коллектора). Иногда это может быть мгновенно, иногда это может занять несколько минут.

Вы можете попробовать настроить сборку мусора для своего оборудования (параметры запуска JBoss). Документация доступна здесь http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html

Когда вы выгружаете приложение, оно будет ждать, пока не остановится весь его поток. Поэтому убедитесь, что весь процесс (запланированные задания, ожидающие вызовы базы данных) завершился корректно.

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

person Jp Vinjamoori    schedule 28.07.2014
comment
Спасибо за указатели! Я использую VisualVM для проверки использования памяти. Поскольку JBoss и Ofbiz работают непрерывно, я мог видеть, что многие классы все еще загружены в память, и многие потоки также активны. Я не знаю, как понять, какие классы и потоки принадлежат какому приложению. Есть ли какой-нибудь инструмент для профилирования, который поможет мне получить эту информацию? - person kajarigd; 29.07.2014
comment
Попробуйте профилировщик Net Beans profiler.netbeans.org В следующей статье подробно рассказывается об обнаружении утечек памяти, которые могут быть вам полезны < a href="http://www.oracle.com/technetwork/java/javase/tooldescr-136044.html" rel="nofollow noreferrer">oracle.com/technetwork/java/javase/tooldescr-136044.html - person Jp Vinjamoori; 13.08.2014