2016-04-21 10 views
0

У нас есть сервер Weblogic, на котором запущено несколько приложений. Некоторые из этих приложений используют экземпляр ActiveMQ, который настроен на использование менеджера транзакций Weblogic XA.OutOfMemoryError из-за огромного количества объектов ActiveMQ XATransactionId

Теперь примерно через 3 минуты после запуска JVM запускает OutOfMemoryError. Дамп кучи показывает, что около 85% всей памяти занято LinkedList, которое содержит экземпляры org.apache.activemq.command.XATransactionId. Список - это корневой объект, и мы не уверены, кому он нужен.

Что может быть причиной этого?

ответ

3

У нас была точно такая же проблема на Weblogic 12c и activemq-ra. Объекты экземпляра XATransactionId были созданы постоянно, вызывая перегрузку сервера.

После более чем двухнедельной отладки мы обнаружили, что проблема вызвана тем, что WebLogic Transaction Manager пытается восстановить некоторые ожидающие транзакции activemq, вызвав метод recover(), который возвращает идентификаторы транзакции, которые, кажется, не завершены, и должны быть восстановлены. Вызов этого метода Weblogic возвращал всегда не нулевое число n (всегда одно и то же) и вызывает создание n экземпляра объекта XATransactionId.

После некоторых исследований мы обнаружили, что Weblogic сохраняет по умолчанию свои журналы транзакций TLOG в файловой системе, и это можно изменить для сохранения в БД. Мы думали, что в TLOG существует проблема с файловой системой, и мы попытались изменить ее на БД, и это сработало! Теперь наш сервер работает более двух недель без перезагрузки, а память стабильна, потому что XATransactionId не создается из необходимой суммы;)

Я надеюсь, что это поможет вам и сообщит нам, если это сработает для вас ,

Удачи вам!

+0

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

0

Если честно, похоже, что вы получаете тонну сообщений JMS и не потребляете их, или, если это так, ваш потребитель не подтверждает сообщения, если они не находятся в режиме автоматического подтверждения.

0

Проверьте свою очередь на очереди JMS. Там может быть очередь с высоким объемом памяти, который пытается прочитать сервер. Возможно, эти сообщения были повреждены из-за некоторого сбоя. . Лучший вариант - удалить отставание в очереди JMS или взять резервную копию в какой-то другой очереди.