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;
相關文章
相關標籤/搜索