簡體   English   中英

ActiveMQ Consumer OutOfMemoryException

[英]ActiveMQ Consumer OutOfMemoryException

我們的ActiveMQ消耗過程耗盡內存並死機。

我們有一個ActiveMQ主題,一個發送者和兩個接收者。 從表面上看,一切正常 - 消息由兩個接收器發送和接收,但最終我們耗盡了所有內存。 堆轉儲顯示了LinkedList $ Node,AtomicReference,ActiveMQObjectMessage,MessageId和MessageDispatch各自的1.362億個實例。 同時,客戶端消息隊列全部為空或幾乎為空。 我認為1.362M可能位於跟蹤未確認消息的列表中。 指定主題設置了AUTO_ACKNOWLEDGE,因此我們嘗試確認,但可能失敗。 (jmsSession = jmsConnection.createSession(false,Session.AUTO_ACKNOWLEDGE);)

堆轉儲顯示看似與客戶端的傳入消息相關聯的垃圾緩沖存在於適度的數字(幾千)。 這似乎與我們設置為發送和使用類似對象的玩具程序中累積的這些對象的數量一致。 它們累積了一段時間,然后得到GC並且記憶在玩具或失敗的程序中永遠不會顯着增長。

猜測五種對象類型與ACKS相關聯是否正確?如果是這樣,盡管兩個消費者顯然已經完全消費了這些對象,但是什么可以導致這些對象保留在這個結構上? 我們有什么方法可以取消我們認為已設置的AUTO_ACKNOWLEDGE嗎? 順便說一句,一個使用者是同步的,使用receive()而另一個是異步的,使用onMessage()。

一種可能具有誤導性的症狀是ActiveMQ GUI顯示對象僅被出列一次,盡管存在兩個消費者。 玩具顯示每個隊列的兩個隊列。 但是,該程序本身表示它們被讀取了預期的次數。

// creating the async consumer.

connAmq = createActiveMqConnection();
connAmq.start();
session = connAmq.createSession(true, Session.AUTO_ACKNOWLEDGE);
Destination topic =        session.createTopic(appProperties.getActiveMqTopicQuotesName());
MessageConsumer consumer = session.createConsumer(topic); 
consumer.setMessageListener(this);

public void onMessage(Message message) {
    ...     
    try {   
            if (message instanceof ObjectMessage) {
                    ObjectMessage msg = (ObjectMessage)message;
                    if (msg instanceof Foo) {
                            Foo quote = (Foo)msg.getObject();
                            ...
                    }       
            }
    }
    ...
}

// creating the sync consumer

jmsConnection = mActiveMQConnectionFactory.createTopicConnection();

jmsConnection.start();
jmsSession = jmsConnection.createSession(false, Session.AUTO_ACKNOWLEDGE);
jmsDestination = jmsSession.createTopic(name);
jmsMessageConsumer = jmsSession.createConsumer(jmsDestination);


//the code for consuming looks like this for the synchronous consumer
while(true)
ObjectMessage m = (ObjectMessage) jmsMessageConsumer.receive();
if (m != null)
    Process(m.getObject());
}

至少在給出的代碼片段中,您創建了一個為異步使用者進行事務處理的會話,但我看不到會話中的提交調用。 事務位保留在代理的內存中,您最終會耗盡Broker的內存。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM