Как устранить неполадки OutOfMemoryError в JBoss? - PullRequest
0 голосов
/ 14 марта 2012

У моего приложения Java EE 6, работающего на JBoss 6, недавно начались проблемы с памятью.

Ситуация

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

Два вопроса с учетом этих фактов:

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

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

Ответы [ 2 ]

1 голос
/ 16 марта 2012

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

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

1 голос
/ 16 марта 2012

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

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

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

-XX:-HeapDumpOnOutOfMemoryError

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

...