Activemq 主题订阅者堆内存泄漏 - 为啥消息在增加?
Posted
技术标签:
【中文标题】Activemq 主题订阅者堆内存泄漏 - 为啥消息在增加?【英文标题】:Activemq topic subscribers heap memory leak - why are messages increasing?Activemq 主题订阅者堆内存泄漏 - 为什么消息在增加? 【发布时间】:2012-01-02 20:33:48 【问题描述】:我有连接到 activemq 主题的控制台应用程序。每个主题每秒发布大约 10 条消息。经过一段时间的监控,应用程序内存正在增加,当所有内存都被使用时,应用程序崩溃。 请参阅下面的转储。为什么 ActiveMQTopicSubsctiber 使用这么多堆?它也不可见,但 ListEntries 大约为~14 000(这意味着 14k 条消息)。
http://imageshack.us/photo/my-images/404/amqmemoryproblem.png
【问题讨论】:
【参考方案1】:可能需要检查的几件事:
-
在您的订阅者中,您确定来自该主题的消息实际被消费了吗?
您的prefetchLimit 指定为什么?
【讨论】:
1) 是的,它们被消耗掉了,我知道这一点,因为它们是在我的 onMessage 方法中登录的。 2) 我没有指定任何内容。让我更新我的问题......我需要实时消费消息,所以如果某些消息变旧(它在 1-2 秒后没有被消费它是旧的)我不需要它,我需要更新的消息紧随其后。我阅读了有关 constantPendingMessageLimitStrategy 的信息,但我不知道如何设置它(生产者和主题代码使用服务组合,而我的消费者使用 java jms 客户端)。是否可以从代理 uri 设置 constantPendingMessageLimitStrategy,如 2) 中的 prefetchLimit? 在查看了最后的转储后,我发现存在同样的问题,即使消耗工作了近 20 个小时也没有问题。所以堆在增加,但更慢。我看到 activemq 主题将消息出列(通过使用 constantPendingMessageLimitStrategy),但在转储中,订阅者持有它们,即订阅的消费者不会丢弃已消费的消息。有什么想法吗? 我无法重新创建...通过一个快速测试用例生成/消费一百万条消息到一个主题,我的堆趋于平稳。你的连接工厂库是什么版本的? 我解决了这个问题。 TopicSession 是使用 CLIENT_ACK 而不是 AUTO_ACK 创建的。这就是主题订阅者保留所有消息的原因,因为它们没有被确认。【参考方案2】:如果在内存中保存消息仍然是个问题,您应该考虑configuring ActiveMQ to use file cursors。文件游标的使用告诉 ActiveMQ 将消息假脱机到磁盘而不是将它们保存在内存中。
【讨论】:
以上是关于Activemq 主题订阅者堆内存泄漏 - 为啥消息在增加?的主要内容,如果未能解决你的问题,请参考以下文章
漏洞复现 - ActiveMQ反序列化漏洞(CVE-2015-5254)
WSO2 ESB 5.0.0 配置 JMS 传输(ActiveMQ)- 主题消息发布与订阅
WSO2 ESB 5.0.0 配置 JMS 传输(ActiveMQ)- 主题消息发布与订阅