參考--
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;