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.

È stato utile?

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

Controlla qui

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top