我们在tomcat 6.0.35上运行activeMQ5.6作为嵌入式代理,并将消息传递选项设置为PERSISTENT.我们在其中一个消费者方面遇到OutOfMemory问题.由于耗时的工作,消费者很慢.我们过去8-10小时后就得到了OOM.在处理3000条消息之后,必须处理大约10000条消息并给予OOM,其余7000条消息保持待处理状态.消息大小非常小~1KB的xml格式.虽然我们在差异队列上有其他消费者非常快,并且还发布了大约10000条消息,并且消息大小非常高~100 KB但我们没有在该队列上获得OOM.虽然它是在同一个经纪人上设置的.
这是错误的堆栈跟踪和out activemq.xml文件
INFO [11/08/12 05:39:31] ActiveMQ会话任务-4开始上传Nam2011_08_prototype/gdfas/mnada/usa/uf3.7z.001到Amazon S3存储桶 - aws-s3-infotech线程中的异常"InactivityMonitor WriteCheck "java.lang.OutOfMemoryError:无法在java.util.conhurrent.ThreadPoolExecutor.addIfUnderMaximumPoolSize的java.lang.Thread.start(Thread.java:640)的java.lang.Thread.start0(本机方法)中创建新的本机线程(ThreadPoolExecutor.java:727)位于org.apache.activemq的org.apache.activemq.transport.AbstractInactivityMonitor.writeCheck(AbstractInactivityMonitor.java:142)的java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:657). transport.AbstractInactivityMonitor $ 2.run(AbstractInactivityMonitor.java:111)atg.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>
Run Code Online (Sandbox Code Playgroud)
这与ActiveMQ无关.错误
java.lang.OutOfMemoryError:无法创建新的本机线程
意味着操作系统没有足够的可用内存来为线程分配.我认为它的方式是Java创建操作系统的每个线程都需要能够创建一个"本机"线程,并且需要内存.您需要释放计算机上的内存,添加内存,或者大多数情况下,非直观地,您应该实际减少堆分配以为操作系统留出更多内容.
一般的经验法则是,在分配给JVM时,您需要为操作系统留出至少可用的内存量.因此,例如,如果你有一个2GB的堆,你需要在那之后至少有2GB空闲(考虑到操作系统也会使用一些内存).
如果您使用JVM设置更新答案,OS,64/32位?和硬件我可以帮你调整它.