2015-07-20 38 views
0

需要Activemq MemoryUsage優化 - 我的隊列正在滿溢

我們有基於java的消息處理系統,其中有近25個不同的隊列和一個主題。我們已經將該系統設置爲最大內存使用量爲2GB,並在正常的一天處理每秒40條消息。這個系統工作了兩天,然後開始在內存中激增,然後達到極限。

在我們的分析中,我們發現MemoryUsage存在這個原因的關鍵,下面是使用接近50%內存的隊列的堆轉儲的可疑堆棧跟蹤。可能會有更高容量的消息可能會大量加載隊列。爲此係統設置MemoryUsage的最佳配置是什麼?

519,955,448 (62.85%) [72] 8 org/apache/activemq/usage/MemoryUsage 0x80d8d180 
519,843,456 (62.84%) [16] 2 java/util/concurrent/CopyOnWriteArrayList 0x80d8d210 
519,843,392 (62.84%) [352] 89 array of java/lang/Object 0x822cd2e0 
411,721,616 (49.77%) [72] 9 org/apache/activemq/usage/MemoryUsage 0x83833378 
411,721,248 (49.77%) [16] 2 java/util/concurrent/CopyOnWriteArrayList 0x83835898 
411,721,184 (49.77%) [8] 2 array of java/lang/Object 0x8383a730 
411,718,600 (49.77%) [336] 33 org/apache/activemq/broker/region/Queue 0x83833120 
411,693,720 (49.77%) [16] 2 org/apache/activemq/store/kahadb/KahaDBTransactionStore$1 0x838353e0 
411,693,256 (49.77%) [24] 3 org/apache/activemq/store/kahadb/KahaDBTransactionStore 0x80d76aa0 
411,689,856 (49.76%) [280] 37 org/apache/activemq/store/kahadb/KahaDBStore 0x80d74de0 
358,088,168 (43.29%) [104] 14 org/apache/kahadb/journal/Journal 0x80d76790 
356,119,216 (43.05%) [48] 1 java/util/concurrent/ConcurrentHashMap 0x80d773c0 
356,119,168 (43.05%) [64] 16 array of java/util/concurrent/ConcurrentHashMap$Segment 0x80d8e628 

回答

0

用這種有限的信息很難推測太多。如果你的消費者落後,記憶就會開始充滿,你無法對此做任何事情。在每秒40個信號的情況下,我猜,它會很快。

你可以做的是在一定的內存限制後將隊列溢出到磁盤。這會降低速度,但至少在峯值期間運行。

該地區本身通常是複雜的,據我所知,沒有銀彈。

閱讀cursors etcmemory usage and producer flow control

+0

只是好奇才知道,如果增長隊列直接與JVM內存或硬盤空間有關。我讀過ActiveMQ將傳入的消息轉換爲ActiveMQMessage對象並保留在內存中,但它也會在硬盤中創建kahaDB存儲文件以維護實際的消息內容。哪一個/兩個都是正確的? – arvinds

+0

永久消息將始終保存到KahaDB(或任何使用的消息存儲區)以避免消息丟失。然而,持久性和非持久性都會被保存到內存中,因爲它速度更快。根據您的配置,您可以選擇在內存不足時應執行的操作。即使用磁盤或阻止生產者。 –