【发布时间】:2012-08-21 02:58:11
【问题描述】:
我们在 tomcat 6.0.35 上运行 activeMQ5.6 作为嵌入式代理,消息传递选项设置为 PERSISTENT。我们在消费者方面遇到了 OutOfMemory 问题。消费者在做耗时的工作时速度很慢。我们曾经在运行 8-10 小时后得到 OOM。有大约 10000 条消息需要处理,它在处理 3000 条消息后给出 OOM,其余 7000 条消息保持在挂起状态。 xml 格式的消息大小非常小~1KB。虽然我们在 diff 队列上有其他消费者非常快,并且还发布了大约 10000 条消息,并且消息大小非常高,大约 100 KB,但我们没有在该队列上获得 OOM。虽然它是在同一个经纪人上设置的。
这里是错误的堆栈跟踪和 activemq.xml 文件
INFO [11/08/12 05:39:31]ActiveMQ 会话 任务 4 - 开始上传 Nam2011_08_prototype/gdfas/mnada/usa/uf3.7z.001 到 Amazon S3 存储桶 - 线程“InactivityMonitor WriteCheck”中的 aws-s3-infotech 异常 java.lang.OutOfMemoryError:无法创建新的本地线程 在 java.lang.Thread.start0(本机方法) 在 java.lang.Thread.start(Thread.java:640) 在 java.util.concurrent.ThreadPoolExecutor.addIfUnderMaximumPoolSize(ThreadPoolExecutor.java:727) 在 java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:657) 在 org.apache.activemq.transport.AbstractInactivityMonitor.writeCheck(AbstractInactivityMonitor.java:142) 在 org.apache.activemq.transport.AbstractInactivityMonitor$2.run(AbstractInactivityMonitor.java:111) 在 org.apache.activemq.thread.SchedulerTimerTask.run(SchedulerTimerTask.java:33) 在 java.util.TimerThread.mainLoop(Timer.java:512) 在 java.util.TimerThread.run(Timer.java:462)
这是来自 activemq.xml 的快照
<persistenceAdapter>
<kahaDB directory="${activemq.data}/kahadb"/>
</persistenceAdapter>
<transportConnectors>
<!-- <transportConnector name="openwire" uri="tcp://localhost:61616"/> -->
<transportConnector name="openwire" uri="tcp://0.0.0.0:61616"/>
<transportConnector name="stomp" uri="stomp://localhost:61613"/>
</transportConnectors>
<networkConnectors>
<!-- by default just auto discover the other brokers -->
<networkConnector name="defaultNetwork" uri="multicast://default"/>
<!--
<networkConnector name="host1 and host2" uri="static://(tcp://host1:61616,tcp://host2:61616)" failover="true"/>
-->
</networkConnectors>
<systemUsage>
<systemUsage>
<memoryUsage>
<memoryUsage limit="512 mb"/>
</memoryUsage>
<storeUsage>
<storeUsage limit="100 gb"/>
</storeUsage>
<tempUsage>
<tempUsage limit="50 gb"/>
</tempUsage>
</systemUsage>
</systemUsage>
<!-- lets define the dispatch policy -->
<destinationPolicy>
<policyMap>
<policyEntries>
<policyEntry queue="SyncServer.>" memoryLimit="512mb" optimizedDispatch="true" queuePrefetch="10">
<pendingQueuePolicy>
<fileQueueCursor/>
</pendingQueuePolicy>
</policyEntry>
</policyEntries>
</policyMap>
</destinationPolicy>
【问题讨论】:
标签: activemq