ActiveMQ在Queue积压消息后内存占用上涨的原因
现象:
我们使用ActiveMQ是用数据库持久化消息的,数据库空间充裕,理论应该queue应该可以堆积几百个G的消息,可是发现堆积几个G的消息后,amq服务的内存便上涨至设置的70%临界点,最终影响发送broker的速度,从而影响整个生产流程。
原因分析:
通过查ActiveMQ内存使用方面的资料,发现从ActiveMQ 5.0.0版本开始,ActiveMQ默认使用Store-based cursors的游标方式来处理在大量堆积的消息。在正常消费速度大于发送速度的时候,消息发送到broker时,先保存在持久存储中,然后直接把消息存放在内存中的LinkedHashMap,很快被消费者消费后清除内存和持久存储,存储中的消息数量会很少,所以并不使用游标。而当消费慢于发送的时候,消息发送到broker时,先保存在持久存储中,然后存在游标里,当需要消息的时候,消息将会以页为单位,从一个挂起的游标(pending cursor)进入LinkedHashMap。这样随着消息的堆积对内存的占用会越来越大。
解决:
可以增大amq内存,具体配置在服务端bin里env
ACTIVEMQ_OPTS_MEMORY="-Xms4G -Xmx4G"
本文地址:https://blog.csdn.net/renhuan28/article/details/84874946