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
只是好奇才知道,如果增长队列直接与JVM内存或硬盘空间有关。我读过ActiveMQ将传入的消息转换为ActiveMQMessage对象并保留在内存中,但它也会在硬盘中创建kahaDB存储文件以维护实际的消息内容。哪一个/两个都是正确的? – arvinds
永久消息将始终保存到KahaDB(或任何使用的消息存储区)以避免消息丢失。然而,持久性和非持久性都会被保存到内存中,因为它速度更快。根据您的配置,您可以选择在内存不足时应执行的操作。即使用磁盘或阻止生产者。 –