【问题标题】:Active MQ giving OutOfMemory error活动 MQ 出现 OutOfMemory 错误
【发布时间】:2012-08-21 02:58:11
【问题描述】:

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

这里是错误的堆栈跟踪和 activemq.xml 文件

INFO [11/08/12 05:39:31]ActiveMQ 会话 任务 4 - 开始上传 Nam2011_08_prototype/gdfas/mnada/usa/uf3.7z.001 到 Amazon S3 存储桶 - 线程“InactivityMonitor WriteCheck”中的 aws-s3-infotech 异常 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


    【解决方案1】:

    这与 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 操作系统:Suse 11 64 位硬件:4 GB RAM , Intel Xeon 2.8 Ghz 四核处理器,8 MB 缓存如果需要任何进一步的信息,请告诉我
    • 添加以下内容,您应该查看它们以了解它们的作用以及它们是否适合您的用例:-XX:+UseCompressedOops -XX:+DoEscapeAnalysis -XX:+AggressiveOpts -Xloggc: gc.log -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -verbosegc。除了一些 64bit 的优化,它还会开启 GC 日志,非常有用。我会减少到 768MB 并与 VisualVM/VisualGC 连接并在正常使用期间观察堆/GC。您可能需要考虑降低堆栈大小、-Xss512k 和 permgen -XX:MaxPermSize=384m,但您需要先分析您的应用。
    • 以上错误从代码端和以上配置中得到更多修复..www.careergoal.in
    猜你喜欢
    • 2014-02-09
    • 1970-01-01
    • 1970-01-01
    • 2016-08-28
    • 2011-10-21
    • 1970-01-01
    • 2018-06-15
    • 2011-09-07
    • 1970-01-01
    相关资源
    最近更新 更多