gpt4 book ai didi

activemq - Activemq 给出 OutOfMemory 错误

转载 作者:行者123 更新时间:2023-12-02 05:32:57 26 4
gpt4 key购买 nike

我们在 tomcat 6.0.35 上运行 activeMQ5.6 作为嵌入式代理,消息传递选项设置为 PERSISTENT。我们在消费者方面遇到了 OutOfMemory 问题。消费者在做耗时的工作时速度很慢。我们曾经在运行 8-10 小时后得到 OOM。在处理 3000 条消息后,有大约 10000 条消息需要处理,它给出了 OOM,其余 7000 条消息保持在待处理状态。消息大小非常小~1KB,采用 xml 格式。虽然我们在 diff 队列上有其他消费者,他们的速度非常快,并且还发布了约 10000 条消息,消息大小相当高,约 100 KB,但我们没有在该队列上遇到 OOM。尽管它是在同一个经纪人上设置的。

这是错误的堆栈跟踪和 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>

最佳答案

这与 ActiveMQ 无关。错误

java.lang.OutOfMemoryError: unable to create new native thread

表示操作系统没有足够的空闲内存分配给线程。我的想法是,对于 Java 创建的每个线程,操作系统都需要能够创建一个“ native ”线程,这会占用内存。您需要释放机器上的内存、添加内存,或者在大多数情况下,您实际上应该减少堆分配,以便为操作系统留出更多内存。

一般的经验法则是,在分配给 JVM 时,您至少需要为操作系统留出一定数量的空闲内存。因此,例如,如果您有一个 2GB 的堆,您之后至少需要有 2GB 的空闲空间(考虑到操作系统也会使用一些内存)。

如果您使用 JVM 设置、操作系统、64/32 位更新您的答案?和硬件我可以帮你调整。

关于activemq - Activemq 给出 OutOfMemory 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12128134/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com