2012-03-14 2 views
0

Приложение Java Java EE 6, работающее на JBoss 6, недавно начало иметь проблемы с памятью.Как устранить проблему OutOfMemoryError в JBoss?

Ситуация

  • сервер производства.
  • Приложение небольшого среднего размера с использованием JPA2/Hibernate с настройками кэширования по умолчанию. ~ 170 классов.
  • Размер DB ~ 1.8gb, 90% которого принадлежит двоичным данным, просто загружаемым сервлетами без какого-либо специального кэширования.
  • Тайм-аут сеанса недавно был увеличен с 2-х часов до 10.
  • JVM конфигурации: -Xrs -Xms1024M -Xmx1024M -XX: MaxPermSize = 512M -Dsun.rmi.dgc.client.gcInterval = 3600000 -server
  • JBoss работает как сервис.
  • Почти все классы контроллеров в ViewScope

Два вопроса с этими фактами в виде:

  • Как бы устранить этот Умес? JConsole не находит JVM, работающие как службы. В идеале я должен был бы проверять релевантные объекты, такие как сеансы, чтобы найти вора памяти.

  • Может ли этот OOME быть законным с увеличенным временем ожидания сеанса, а решение просто увеличить размер кучи? Приложение работает с сентября 2011 года без каких-либо проблем с памятью. Сессионный тайм-аут резко увеличился примерно два месяца назад.

+0

К сожалению, до этого я больше не разбирался в этом вопросе, и, похоже, сейчас он разрешился.Параметр дампа кучи будет хорошим местом для начала, проблемы снова появятся, добавив VisualJVM и похоже на производственный сервер, кажется жестким. В любом случае я приму ваш ответ, так как он содержит советы по анализу кучи. –

ответ

1

Кажется логичным, что сеанс будет использовать определенный объем памяти в JBoss. Увеличение времени ожидания сеанса, вероятно, приведет к большему количеству сеансов в памяти в любой момент - так что вы, вероятно, увеличили потребность в памяти вашего приложения.

Простейшим (начальным) разрешением было бы увеличить выделение кучи для вашего приложения. Например, установите -Xmx2g (это удваивает память JVM до 2 GiB - текущая настройка составляет 1 гигабайт). Очевидно, что ваша система должна иметь достаточную физическую память.

Если это просто задерживает ваших OOME, вам нужно проанализировать свою кучу. Enable:

-XX:-HeapDumpOnOutOfMemoryError

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

1

VisualJVM - отличный инструмент, включенный в JDK, который вы можете использовать для диагностики таких ошибок. Для его работы с JBoss вы можете ознакомиться с this.

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

Смежные вопросы