2012-08-26 64 views
2

我們正在將tomcat 6.0.35上的activeMQ5.6作爲嵌入式代理運行,消息傳遞選項設置爲PERSISTENT。我們正在消費者一方獲得OutOfMemory問題。消費者在做耗時的工作時速度很慢。運行8-10小時後,我們曾經獲得了OOM。在處理3000條消息之後有約10000條消息需要處理,並且其餘7000條消息處於待處理狀態。消息大小非常小,以xml格式爲1KB。雖然我們有其他消費者在差異隊列中速度非常快,並且還有約10000條消息被髮布,並且消息大小很高〜100 KB,但我們沒有在該隊列中獲得OOM。雖然它安裝在同一個經紀人。發生OutOfMemory錯誤的活動MQ

以下是錯誤的進出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> 

回答

5

此無關和ActiveMQ快照。錯誤

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

意味着操作系統沒有足夠的可用內存爲線程分配。我想到的方式是,Java創建操作系統的每個線程都需要能夠創建一個「本地」線程,並且需要內存。您需要釋放機器上的內存,增加內存,或者大部分時間,不直觀的是,實際上應該減少堆分配,爲操作系統留下更多內存。

一般的經驗法則是,當您分配給JVM時,您需要至少留出OS的可用內存量。例如,如果你有一個2GB的堆,那麼你需要至少有2GB空閒空間(考慮到操作系統也將使用一些內存)。

如果您更新您的答案與您的JVM設置,操作系統,64/32位?和硬件,我可以幫你調整它。

+0

嗨傑里米, 感謝您的回覆。請找出所有低於所需信息: JVM設置:EXEC 「$ EXEC」 -Xmx1024M -Djava.net.preferIPv4Stack =真-classpath 「$ CP」 com.mycompany.jms.Subscriber 操作系統:Suse的11的64位 硬件:4 GB RAM,帶8 MB緩存的Intel Xeon 2.8 Ghz四核處理器 請讓我知道是否需要更多信息 –

+0

添加以下內容,您應該查看它們以瞭解它們的作用以及它們是否合適對於您的用例:-XX:+ UseCompressedOops -XX:+ DoEscapeAnalysis -XX:+ AggressiveOpts -Xloggc:gc.log -XX:+ PrintGCTimeStamps -XX:+ PrintGCDetails -verbosegc。除了一些64位優化之外,它還會打開非常有用的GC日誌。我會減少到768MB,並與VisualVM/VisualGC連接,並在正常使用期間觀察堆/ GC。您可能需要考慮降低堆棧大小,-Xss512k和permgen -XX:MaxPermSize = 384m,但您需要首先對應用進行配置。 – Jeremy

+0

上面的錯誤修正了更多的代碼和上面的配置..www.careergoal.in –