能进这个帖子的相信的或多或少懂AMQ,所有,谢谢各位的热心,我在使用AMQ的过程中遇到了一些问题,也不清楚是配置还是AMQ的问题,特请教,谢谢。 
使用环境: 
ActiveMQ版本是:5.5 
Broker配置: 
MemoryLimit:256m 
Persistent:true 
StoreLimit:10g 
TempLimit:10g 
使用Topic: 
两个订阅者,其中一个离线。 
发送端对一个文件进行分块,每块1M发送到AMQ,通过jconsole分析发现 
1.每发送一个块消息,AMQ内存就上涨5,6M。 
2.在线的订阅者接收完消息后,内存使用大致停留在发送完最后一块消息出处,手动在jconsole中执行GC,没有明显下降。 
3.将另外一个订阅者启动,接收完所有消息,内存依旧没有下降,手动在jconsole中执行GC,内存回到初始正常范围。 
4.如果发送一个较大的文件(比broker配置的内存大),在jconsole中发送,amq内存直线上升,直到达到Amq最大内存,消息发送端报出内存溢出停止,然后amq内存一直停在最大值。当订阅者接收完后,执行GC,内存才会释放。 
下面是jconsole与JProfiler监控图,共两张, 
第一张是消息发送完,一个在线订阅者接收完后的内存使用情况。 
第二张是离线订阅者启动接收完消息,并手动在jconsole中执行GC的结果

解决方案 »

  1.   

    policyEntry 设置似乎没起什么作用。
    消息加入TTL,应该是可行的。有些policyEntry依赖TTL 像oldest如果发送间隔比较长
    <policyEntry memoryLimit="10mb" producerFlowControl="false" queue=">" advisoryForConsumed="false" advisoryForDelivery="false"  gcInactiveDestinations="true" inactiveTimoutBeforeGC="10000">
    如上,10秒没消息删除topic