java - ActiveMQ 内存泄漏 - 了解堆中的对象

标签 java memory-leaks activemq

我的 ActiveMQ 堆大小不断增加,最终耗尽内存。对仍在运行的一个实例进行堆转储,并得到以下具有大量实例的类(其余类非常少)。寻找有关此处可能出现问题的指示。

170866 instances of class org.apache.activemq.command.ProducerId
170526 instances of class org.apache.activemq.broker.jmx.AnnotatedMBean
170519 instances of class org.apache.activemq.command.SessionId
170518 instances of class org.apache.activemq.command.ConnectionId
170482 instances of class org.apache.activemq.broker.ProducerBrokerExchange
170482 instances of class org.apache.activemq.broker.jmx.ProducerView
170482 instances of class org.apache.activemq.command.ProducerInfo
170482 instances of class org.apache.activemq.state.ProducerState

发送消息的代码片段:

MessageProducer messageProducer = session.createProducer(topic);
messageProducer.setTimeToLive(5 * 60 * 1000);
Message message = session.createObjectMessage(agentDebugEvent);
messageProducer.send(message);

是因为缺少messageProducer.close()吗?

最佳答案

如果您为每个消息发送创建生产者并且从不关闭它们,那么将为这些生产者构建 JMX MBean,因为每个生产者都在 JMX 树中公开,以便管理和调试它们正在执行的操作。您当然可以关闭 JMX,这会降低开销,但您仍然会慢慢走向 Broker 最终的死亡,因为它仍然需要跟踪附加的生产者。

如果您想做这样的事情(我不知道为什么您会这样做),您可以切换到 JMS 池,这将进行一些资源池操作,这样您就可以在每次发送时创建一个生产者,并且它只需使用缓存的匿名生产者。实际上,虽然这通常是一个糟糕的设计,但您应该评估为什么您认为您需要按照这些思路做一些事情。

创建 MessageProducer 是一项成本高昂的操作,涉及网络往返、创建代理端资源(例如 MBean 等)。如果您正在寻找发送者的性能,那么创建一个生产者并继续重用它。

关于java - ActiveMQ 内存泄漏 - 了解堆中的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42074887/

相关文章:

jsp - tomcat - 计时器内存泄漏

java - 有没有更好的方法来编写这个循环?

java - Vaadin 14 组合框选择鼠标悬停时的工具提示

javascript - 如何控制IE6+jQuery+jQuery-ui内存泄漏?

swift - 初始 View Controller 应该调用 "deinit"吗?

java - ActiveMQ - 队列中主题和并发消费者之间的区别?

amazon-web-services - 如何增加 AmazonMQ 最大连接数

java - 在使用 Files.walk API 的 java8 中,无法使用绝对路径从文件夹中读取文件

java - 从数组列表中删除元素不起作用,发生重复?(基本宾果游戏)

java - 哪个嵌入式消息系统 -> ActiveMQ 或 HornetQ