Activemq 在大流量下出现内存耗尽的情况以及解决方案

在大量消息持续发送到broker的情况下,当broker到消费者之间的网络满了以后,broker的消息无法发送出去,导致在TransportConnection的dispatchQueue中堆积的消息越来越多。PendingMessageCursor中的消息不能被及时消费,导致broker判断消费者为慢消费者。当broker的内存被耗尽后JVM会频繁的进行full gc,由于消息不能被回收,所以消息对象会从年轻代转移到老年代而不会释放内存,导致broker几乎停止对外服务。

这个问题的根本原因是ActiveMQ只对接收消息作了流量控制,但是没有发送消息堵塞的情况。需要根据消息发送情况来控制消息的接收。

解决方案,在TransportConnection中的dispatchAsync对dispatchQueue中的消息数量做判断,当超过阈值就暂停dispatch,当前thread sleep,这样TopicSubscription就会暂停接收消息,避免内存耗尽。

猜你喜欢

转载自javavsnet.iteye.com/blog/1998792