由于大量 ActiveMQ XATransactionId 对象导致的 OutOfMemoryError
OutOfMemoryError due to a huge number of ActiveMQ XATransactionId objects
我们有一个 Weblogic 服务器 运行 几个应用程序。其中一些应用程序使用配置为使用 Weblogic XA 事务管理器的 ActiveMQ 实例。
现在JVM在启动大约3分钟后触发OutOfMemoryError。堆转储显示大约 85% 的内存被包含 org.apache.activemq.command.XATransactionId 个实例的 LinkedList 占用。该列表是一个根对象,我们不确定谁需要它。
这可能是什么原因造成的?
老实说,这听起来像是您收到了大量 JMS 消息,但要么没有使用它们,要么如果您使用了这些消息,但如果它们未处于自动确认模式,则您的消费者不会确认这些消息。
我们在 Weblogic 12c 和 activemq-ra 上遇到了完全相同的问题。连续创建 XATransactionId 对象实例导致服务器过载。
经过 2 个多星期的调试,我们发现问题是 WebLogic 事务管理器试图通过调用方法 recover() 来恢复一些挂起的 activemq 事务引起的,其中 returns 似乎是事务的 id未完成,必须恢复。 Weblogic 对此方法的调用始终返回一个非空数字 n(始终相同),这会导致创建 XATransactionId 对象的 n 个实例。
经过一些调查,我们发现Weblogic默认将其事务日志TLOG存储在文件系统中,这可以更改为持久化在数据库中。我们认为 TLOG 在文件系统中存在问题,我们尝试将其更改为 DB 并且成功了!现在我们的服务器运行超过 2 周没有任何重启并且内存是稳定的因为没有 XATransactionId 从必要的数量中创建一部分;)
希望这对您有所帮助,如果对您有用,请随时通知我们。
祝你好运!
检查您的 JMS 队列积压。可能存在大量积压的队列,服务器正在尝试读取该队列。由于某些崩溃,这些消息可能已损坏
最好的选择是删除 JMS 队列中的积压或在其他队列中进行备份
我们有一个 Weblogic 服务器 运行 几个应用程序。其中一些应用程序使用配置为使用 Weblogic XA 事务管理器的 ActiveMQ 实例。
现在JVM在启动大约3分钟后触发OutOfMemoryError。堆转储显示大约 85% 的内存被包含 org.apache.activemq.command.XATransactionId 个实例的 LinkedList 占用。该列表是一个根对象,我们不确定谁需要它。
这可能是什么原因造成的?
老实说,这听起来像是您收到了大量 JMS 消息,但要么没有使用它们,要么如果您使用了这些消息,但如果它们未处于自动确认模式,则您的消费者不会确认这些消息。
我们在 Weblogic 12c 和 activemq-ra 上遇到了完全相同的问题。连续创建 XATransactionId 对象实例导致服务器过载。
经过 2 个多星期的调试,我们发现问题是 WebLogic 事务管理器试图通过调用方法 recover() 来恢复一些挂起的 activemq 事务引起的,其中 returns 似乎是事务的 id未完成,必须恢复。 Weblogic 对此方法的调用始终返回一个非空数字 n(始终相同),这会导致创建 XATransactionId 对象的 n 个实例。
经过一些调查,我们发现Weblogic默认将其事务日志TLOG存储在文件系统中,这可以更改为持久化在数据库中。我们认为 TLOG 在文件系统中存在问题,我们尝试将其更改为 DB 并且成功了!现在我们的服务器运行超过 2 周没有任何重启并且内存是稳定的因为没有 XATransactionId 从必要的数量中创建一部分;)
希望这对您有所帮助,如果对您有用,请随时通知我们。
祝你好运!
检查您的 JMS 队列积压。可能存在大量积压的队列,服务器正在尝试读取该队列。由于某些崩溃,这些消息可能已损坏 最好的选择是删除 JMS 队列中的积压或在其他队列中进行备份