【问题标题】:OutOfMemoryError due to a huge number of ActiveMQ XATransactionId objects由于大量 ActiveMQ XATransactionId 对象导致 OutOfMemoryError
【发布时间】:2016-04-21 20:37:06
【问题描述】:

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

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

这是什么原因造成的?

【问题讨论】:

    标签: java weblogic activemq xa


    【解决方案1】:

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

    经过2个多星期的调试,我们发现问题是由于WebLogic事务管理器试图通过调用recover()方法来恢复一些挂起的activemq事务引起的,该方法返回了似乎没有完成的事务的ids要恢复。 Weblogic 对该方法的调用总是返回一个非空数字 n(总是相同),这会导致创建 XATransactionId 对象的 n 个实例。

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

    我希望这会对您有所帮助,如果它对您有用,请随时通知我们。

    祝你好运!

    【讨论】:

    • 我不再参与该项目,但我认为在某些时候我们删除了 tx 日志,因为它肯定是陈旧的,这在当时解决了问题。因此标记为正确。
    【解决方案2】:

    老实说,听起来您收到大量 JMS 消息并且没有使用它们,或者如果您是,如果消息未处于自动确认模式,您的消费者不会确认消息。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2019-07-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-30
        • 2019-02-10
        • 2012-08-21
        • 2021-07-18
        相关资源
        最近更新 更多