由于大量ActiveMQ XATransactionId对象导致的OutOfMemoryError

时间:2016-04-21 20:37:07

标签: java weblogic activemq xa

我们有一个运行多个应用程序的Weblogic服务器。其中一些应用程序使用ActiveMQ实例,该实例配置为使用Weblogic XA事务管理器。

现在,在启动后大约3分钟后,JVM会触发OutOfMemoryError。堆转储显示大约85%的内存被包含org.apache.activemq.command.XATransactionId实例的LinkedList占用。该列表是一个根对象,我们不确定谁需要它。

是什么导致这种情况?

3 个答案:

答案 0 :(得分:3)

我们在Weblogic 12c和activemq-ra上遇到了完全相同的问题。 XATransactionId对象实例不断创建,导致服务器过载。

经过两周多的调试,我们发现问题是由WebLogic事务管理器尝试通过调用方法recover()来恢复某些挂起的activemq事务引起的,该方法返回了似乎未完成的事务ID并具有待收回。 Weblogic对此方法的调用始终返回非空数n(始终相同),并导致创建XATransactionId对象的n实例。

经过一些调查,我们发现Weblogic默认将其事务日志TLOG存储在文件系统中,并且可以将其更改为在DB中保留。我们认为TLOG存在文件系统中存在问题,我们尝试将其更改为DB并且它有效!现在我们的服务器运行超过2周没有任何重启,内存稳定,因为没有XATransactionId从必要的数量创建一部分;)

我希望这会对您有所帮助,并告知我们是否适合您。

祝你好运!

答案 1 :(得分:0)

说实话,听起来你收到了大量的JMS消息而且没有消耗它们,或者,如果你这样做,你的消费者如果不处于自动确认模式就不会确认消息。

答案 2 :(得分:0)

检查您的JMS队列待办事项。可能存在具有高积压的队列,该服务器正在尝试读取。由于某些崩溃,这些消息可能已损坏 最好的选择是删除JMS队列中的积压或在其他队列中备份