ActiveMQ : Async error occurred: java.lang.OutO...

参考-- http://activemq.apache.org/javalangoutofmemory.html
       对于MQ的内容实用是可管理和可配置的。首先需要判断的是MQ的哪部分系统因内存不足而导致泄漏,是JVM,broker还是消费者、生产者?
       一、内存管理
       JVM内存管理:
       1. 用bin/activemq命令在独立JVM中运行broker。用-Xmx和-Xss命令即可(activemq.bat文件中修改ACTIVEMQ_OPTS选项参数即可);
       2. 默认情况下,MQ用512M的JVM;
       broker内存管理:
       1. broker使用的内存并不是由JVM的内存决定的。虽然受到JVM的限制,但broker确实独立管理器内存;
       2. systemUsage和destination的内存限制与broker内存息息相关;
       3. MQ中内存的关系是:JVM->Broker->broker features;
       4. 所有destination的内存总量不能超过broker的总内存;
       消费者:
       1. 由于消息大小可以配置,prefetch limit往往是导致内存溢出的主要原因;
       2. 减少prefetch limit的大小,会减少消费者内存中存储的消息数量;
       生产者:
       1. 除非消息数量超过了broker资源的限制,否则生产者不会导致内存溢出;
       2. 当内存溢出后,生产者会收到broker的阻塞信息提示;
       二、其他
       将消息缓冲之硬盘:
       1. 只有当消息在内存中存储时,才允许消息的快速匹配与分发,而当消费者很慢或者离开时,内存可能会耗尽;
       2. 当destination到达它的内存临界值时,broker会用消息游标来缓存非持久化的消息到硬盘。
       3. 临界值在broker中通过memoryUsage和systemUsage两个属性配置,请参考activemq.xml;
       4. 对于缓慢的消费者,当尚未耗尽内存或者转变为生产者并发控制模式前,这个特性允许生产者继续发送消息到broker;
       5. 当有多个destination的时候,默认的内存临界值可能被打破,而这种情况将消息缓存到硬盘就显得很有意义;
       6. precentUsage配置:使用百分比来控制内存使用情况;
       多个线程:
       1. 默认情况下,MQ每个destination都对应唯一的线程;
       2. -Dorg.apache.activema.UseDedicatedTaskRunner=false(activemq.bat文件中修改ACTIVEMQ_OPTS选项参数即可),用线程池来限制线程的数量,从而减少内存消耗;
       大数据传输:
       1. destination policies--maxPageSize:控制进入内存中的消息数量;lazyDispatch:增加控制使用当前消费者列表的预取值;
       2. 使用blogMessage或者streamsMessage类型来进行大量文件的传输;
       泄漏JMS资源:
       1. 当session或者producer或者consumer大量存在而没有关闭的时候;
       2. 使用PooledConnectionFactory;

转载于:https://my.oschina.net/hbdrawn/blog/26216

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值