我们正在将tomcat 6.0.35上的activeMQ5.6作为嵌入式代理运行,消息传递选项设置为PERSISTENT。我们正在消费者一方获得OutOfMemory问题。消费者在做耗时的工作时速度很慢。运行8-10小时后,我们曾经获得了OOM。在处理3000条消息之后有约10000条消息需要处理,并且其余7000条消息处于待处理状态。消息大小非常小,以xml格式为1KB。虽然我们有其他消费者在差异队列中速度非常快,并且还有约10000条消息被发布,并且消息大小很高〜100 KB,但我们没有在该队列中获得OOM。虽然它安装在同一个经纪人。发生OutOfMemory错误的活动MQ
以下是错误的进出activemq.xml中文件
INFO [11/08/12 05:39:31]ActiveMQ Session Task-4- Start Uploading Nam2011_08_prototype/gdfas/mnada/usa/uf3.7z.001 to Amazon S3 bucket - aws-s3-infotech Exception in thread "InactivityMonitor WriteCheck" java.lang.OutOfMemoryError: unable to create new native thread at java.lang.Thread.start0(Native Method) at java.lang.Thread.start(Thread.java:640) at java.util.concurrent.ThreadPoolExecutor.addIfUnderMaximumPoolSize(ThreadPoolExecutor.java:727) at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:657) at org.apache.activemq.transport.AbstractInactivityMonitor.writeCheck(AbstractInactivityMonitor.java:142) at org.apache.activemq.transport.AbstractInactivityMonitor$2.run(AbstractInactivityMonitor.java:111) at org.apache.activemq.thread.SchedulerTimerTask.run(SchedulerTimerTask.java:33) at java.util.TimerThread.mainLoop(Timer.java:512) at 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>
嗨杰里米, 感谢您的回复。请找出所有低于所需信息: JVM设置:EXEC “$ EXEC” -Xmx1024M -Djava.net.preferIPv4Stack =真-classpath “$ CP” com.mycompany.jms.Subscriber 操作系统:Suse的11的64位 硬件:4 GB RAM,带8 MB缓存的Intel Xeon 2.8 Ghz四核处理器 请让我知道是否需要更多信息 –
添加以下内容,您应该查看它们以了解它们的作用以及它们是否合适对于您的用例:-XX:+ UseCompressedOops -XX:+ DoEscapeAnalysis -XX:+ AggressiveOpts -Xloggc:gc.log -XX:+ PrintGCTimeStamps -XX:+ PrintGCDetails -verbosegc。除了一些64位优化之外,它还会打开非常有用的GC日志。我会减少到768MB,并与VisualVM/VisualGC连接,并在正常使用期间观察堆/ GC。您可能需要考虑降低堆栈大小,-Xss512k和permgen -XX:MaxPermSize = 384m,但您需要首先对应用进行配置。 – Jeremy
上面的错误修正了更多的代码和上面的配置..www.careergoal.in –