Active MQ给出OutOfMemory错误

时间:2012-08-26 06:37:17

标签: activemq

我们在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 Session   任务-4开始上传   到Amazon S3存储桶的Nam2011_08_prototype / gdfas / mnada / usa / uf3.7z.001 -   aws-s3-infotech线程“InactivityMonitor WriteCheck”中的异常   java.lang.OutOfMemoryError:无法创建新的本机线程                   at java.lang.Thread.start0(Native Method)                   在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)                   在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>

1 个答案:

答案 0 :(得分:5)

这与ActiveMQ无关。错误

  

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

表示操作系统没有足够的可用内存来为线程分配。我认为它的方式是Java创建操作系统的每个线程都需要能够创建一个“本机”线程,并占用内存。你需要释放机器上的内存,增加内存,或者大多数时候,非直观地说,实际上你应该减少堆分配,为操作系统留出更多。

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

如果您使用JVM设置(OS,64/32位)更新答案?和硬件我可以帮你调整它。