繁体   English   中英

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

[英]ActiveMQ memory leak - Understanding objects in the heap

我的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,这样可以降低开销,但是您仍然会慢慢地逐渐走向代理的最终死亡,因为它仍然需要跟踪附加的生产者。

如果您想做这样的事情(我不知道为什么会这么做),您可以切换到JMS池,这将对资源进行一些池化,以便您似乎可以为每个发送创建一个生产者,并且只需使用缓存的匿名生产者。 实际上,尽管这通常是一个糟糕的设计,但您应该评估为什么认为自己需要按照这些原则做一些事情。

创建MessageProducer是一项昂贵的操作,涉及通过网络来回往返,创建代理端资源(例如MBeans等)。如果您正在寻找发件人的性能,请创建一个生产者并继续重复使用它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM