Как улучшить объем памяти, используемый Jboss?

У меня есть приложение Java EE, работающее на jboss-5.0.0.GA. Приложение использует инструмент отчетов BIRT для создания нескольких отчетов.

Сервер имеет 4 ядра по 2,4 ГГц и 8 ГБ оперативной памяти.

Сценарий запуска использует следующие параметры:

 -Xms2g -Xmx2g -XX:MaxPermSize=512m

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

Сейчас приложение не вылетает, но память всегда используется полностью. Пример верхней команды:

Mem:   7927100k total,  7874824k used,    52276k free

Процесс Java показывает использование 2,6g, и это единственное приложение, работающее на этом сервере.

Что я могу сделать, чтобы обеспечить объем свободной памяти?

Что я могу сделать, чтобы попытаться найти утечку памяти?

Любое другое предложение?

ТИА


Основано на ответе меззи:

Если вы используете Linux, то, что ядро ​​делает с памятью, отличается от того, как работает Windows. В Linux он попытается использовать всю память. После того, как он использует все, он будет перерабатывать память для дальнейшего использования. Это не утечка памяти. У нас также есть jboss tomcat на нашем Linux-сервере, и мы некоторое время назад исследовали эту проблему.

Я нашел больше информации об этом,

https://serverfault.com/questions/9442/why-does-red-hat-linux-report-less-free-memory-on-the-system-than-is-actually-ava

http://lwn.net/Articles/329458/

Ну и половина памяти кешируется:

             total       used       free     shared    buffers     cached
Mem:          7741       7690         50          0        143       4469

person Karma police    schedule 17.11.2010    source источник


Ответы (3)


Если вы используете Linux, то, что ядро ​​делает с памятью, отличается от того, как работает Windows. В Linux он попытается использовать всю память. После того, как он использует все, он будет перерабатывать память для дальнейшего использования. Это не утечка памяти. У нас также есть jboss tomcat на нашем Linux-сервере, и мы некоторое время назад исследовали эту проблему.

person mezzie    schedule 18.11.2010
comment
Да, это RHEL 4. Я этого не знал. Спасибо - person Karma police; 18.11.2010

Бьюсь об заклад, это значения памяти операционной системы, а не значения памяти Java. Java использует всю память до -Xmx, а затем начинает собирать мусор, чтобы сильно упростить. Используйте jconsole, чтобы узнать, каково реальное использование памяти Java.

person bmargulies    schedule 18.11.2010

Для простоты максимальный объем памяти JVM равен MaxPermGen (постоянно используется во время работы вашей JVM. Он содержит определения классов, поэтому он не должен увеличиваться с нагрузкой вашего сервера) + Xmx (максимальный размер куча объектов, которая содержит все экземпляры объектов, работающих в настоящее время в JVM) + Xss (пространство стеков потоков, в зависимости от количества потоков, работающих в вашей JVM, которое в большинстве случаев может быть ограничено для сервера) + прямое пространство памяти (устанавливается параметром -XX:MaxDirectMemorySize=xxxx)

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

Риск в том, что если нагрузка на ваш сервер возрастет, вы можете получить ошибку OutOfMemoryError...

person Alexis Dufrenoy    schedule 18.11.2010