2015-07-20 65 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(或任何使用的消息存储区)以避免消息丢失。然而,持久性和非持久性都会被保存到内存中,因为它速度更快。根据您的配置,您可以选择在内存不足时应执行的操作。即使用磁盘或阻止生产者。 –