Activemq 活动MQ发出OfMemory错误

Activemq 活动MQ发出OfMemory错误,activemq,Activemq,我们在Tomcat6.0.35上运行activeMQ5.6作为嵌入式代理,消息传递选项设置为持久。我们正在解决一个消费者方面的记忆问题。消费者的速度很慢,因为他们的工作很耗时。我们通常在跑步8-10小时后得到OOM。在处理3000条消息后,必须处理约10000条消息,其余7000条消息保持挂起状态。消息大小非常小,xml格式为1KB。虽然我们在diff队列上还有其他用户速度非常快,并且发布了约10000条消息,消息大小相当高,约100KB,但我们在该队列上没有得到OOM。虽然它是在同一个代理上设

我们在Tomcat6.0.35上运行activeMQ5.6作为嵌入式代理,消息传递选项设置为持久。我们正在解决一个消费者方面的记忆问题。消费者的速度很慢,因为他们的工作很耗时。我们通常在跑步8-10小时后得到OOM。在处理3000条消息后,必须处理约10000条消息,其余7000条消息保持挂起状态。消息大小非常小,xml格式为1KB。虽然我们在diff队列上还有其他用户速度非常快,并且发布了约10000条消息,消息大小相当高,约100KB,但我们在该队列上没有得到OOM。虽然它是在同一个代理上设置的

下面是错误的stacktrace和out activemq.xml文件

信息[11/08/12 05:39:31]ActiveMQ会话 任务4-开始上传 Nam2011_08_原型/gdfas/mnada/usa/uf3.7z.001至亚马逊S3桶- aws-s3-infotech线程“InactivityMonitor WriteCheck”中出现异常 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无关。错误

java.lang.OutOfMemoryError:无法创建新的本机线程

意味着操作系统没有足够的空闲内存来分配给线程。我认为,对于Java创建的每个线程,操作系统都需要能够创建一个“本机”线程,这需要内存。您需要释放机器上的内存,添加内存,或者在大多数情况下,实际上应该减少堆分配,为操作系统留下更多内存

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


如果用JVM设置更新答案,操作系统,64/32位?我可以帮你调整。

你好,杰里米,谢谢你的回复。请在下面找到所有必需的信息:JVM设置:exec“$exec”-Xmx1024M-Djava.net.preferIPv4Stack=true-classpath“$CP”com.mycompany.jms.Subscriber OS:Suse 11 64位硬件:4 GB RAM,带8 MB缓存的英特尔至强2.8 Ghz四核处理器请告诉我是否需要更多信息添加以下内容,您应该查找它们以了解它们的作用以及它们是否适合您的用例:-XX:+UseCompressedOops-XX:+DoEscapeAnalysis-XX:+AggressiveOpts-Xloggc:gc.log-XX:+PrintGCTimeStamps-XX:+PrintGCDetails-verbosegc。除了一些64位优化之外,它还将打开GC日志,这非常有用。我会减少到768MB,并连接VisualVM/VisualGC,并在正常使用期间观察heap/GC。您可能需要考虑降低StActhSead、-XSS512K和PrimGeN-X:Max PrimeSimule:380m,但您需要首先对应用程序进行配置。以上错误更多地从代码侧和上面的配置中确定。