我的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()
丢失了吗?
答案 0 :(得分:2)
如果要为每个消息发送创建生成器并且从不关闭它们,那么将为这些生成器构建JMX MBean,因为每个生成器都在JMX树中公开,以便管理和调试它们正在执行的操作。您当然可以关闭JMX,这样可以降低开销,但您仍然会慢慢走向经纪人的最终死亡,因为它仍然需要跟踪附加的生产商。
如果你想做这样的事情(我不知道你为什么会这样做),你可以切换到JMS池,这会做一些资源汇集,这样你可以看起来每个发送一个生产者它只会使用一个缓存的匿名生产者。实际上,虽然这是一个普遍较差的设计,你应该评估为什么你认为你需要在这些方面做一些事情。
创建MessageProducer是一项代价高昂的操作,涉及通过网络进行往返,创建代理端资源(如MBean等)。如果要在发件人中查找性能,请创建一个生产者并继续重复使用。