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

参考-- http://activemq.apache.org/javalangoutofmemory.html
       对于MQ的内容实用是可管理和可配置的。首先须要判断的是MQ的哪部分系统因内存不足而致使泄漏,是JVM,broker仍是消费者、生产者?
       1、内存管理
       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的阻塞信息提示;
       2、其余
       将消息缓冲之硬盘:
       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;
相关文章
相关标签/搜索