ActiveMQ OutOfMemory Impossibile creare più thread
Domanda
Sto simulando un sovraccarico di un server e visualizzo questo errore:
java.lang.OutOfMemoryError: unable to create new native thread
Ho letto in questa pagina http://activemq.apache.org/javalangoutofmemory.html, che posso aumentare la dimensione della memoria. Ma come posso farlo? Quale file devo modificare? Ho provato a passare gli argomenti dallo script bin / activemq ma senza fortuna.
Soluzione
Il tuo caso corrisponde a numero enorme di thread . Esistono 3 modi per risolverlo:
- riduce il numero di thread (ovvero -Dorg.apache.activemq.UseDedicatedTaskRunner = false nel documento)
- riduci le dimensioni dello stack per thread con l'opzione -Xss (valori predefiniti: 320 KiB per Java a 32 bit su Win / Linux, 1024 KiB per Java a 64 bit su Win / Linux, vedi < a href = "http://www.oracle.com/technetwork/java/hotspotfaq-138619.html#threads_oom" rel = "nofollow noreferrer"> doc )
- riduci ( non estendi ) dimensione heap -Xmx per fare spazio agli stack per thread (512 MiB per impostazione predefinita nello script ActiveMQ)
Nota : se stack o heap è troppo piccolo, deve causare un altro OutOfMemoryError .
Puoi specificarli usando la variabile della shell ACTIVEMQ_OPTS (in UNIX). Ad esempio, eseguire ActiveMQ come
ACTIVEMQ_OPTS=-Xss160k bin/activemq
Altri suggerimenti
Specifica l'argomento -Xmx
sulla VM che esegue ActiveMQ - Tomcat, ad esempio.
È possibile assegnare alla macchina virtuale Java più memoria utilizzando l'argomento comando -Xmx .
Per esempio. java -Xmx512M MyClass
Stavamo riscontrando questo problema su un sistema Linux (RedHat Enterprise 5) e abbiamo scoperto che su questa build l'ulimit nprocs in /etc/security/limits.conf
controlla effettivamente il numero di thread a l'utente può spawnare.
Puoi visualizzare questo limite usando il comando ulimit -a
.
Immediatamente questo era impostato su un limite soft di 100 e un limite hard di 150, che è terribilmente inferiore al numero di thread necessari per eseguire un moderno App Server.
Abbiamo rimosso del tutto questo limite e risolto questo problema per noi.
Non sembra che tu stia esaurendo lo spazio dell'heap, quindi non aumentarlo (l'opzione -Xmx). Invece, l'applicazione sta esaurendo la memoria di processo e diminuendo lo spazio dell'heap libererà la memoria di processo per l'uso nativo. La domanda è: perché stai usando così tanta memoria di processo? Se non usi JNI, probabilmente hai creato troppi thread e il post di habe ha spiegato come risolverlo.