Non riesco a creare più di 32k di thread Java su macchine Linux con memoria 15G.Come aumentare il numero massimo di thread JVM (Linux 64 bit)
risposta
È possibile utilizzare uno sample program per individuare il limite di thread corrente.
Se si verifica Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread
, controllare questi:
Nelle macchine di memoria di piccole dimensioni
filo Ogni Java consumare la propria memoria stack. La dimensione dello stack predefinito è 1024k (= 1M). È possibile ridurre le dimensioni dello stack come
java -Xss512k ...
. JVM non può essere avviato se la dimensione dello stack è troppo bassa.E fare attenzione alle configurazioni della memoria heap: (iniziale)
-Xms
e (massimo)-Xmx
. Più memoria viene allocata all'heap, meno memoria disponibile per lo stack.Limiti del sistema
Alcuni valori in
ulimit -a
possono influenzare un limite della filettatura.max memory size
- illimitata sulla maggior parte delle macchine a 64 bitmax user processes
- Linux tratta i fili come processivirtual memory
- illimitate sulla maggior parte delle macchine a 64 bit. utilizzo della memoria virtuale aumenta di configurazione di -Xss (default 1024k)
È possibile modificare questi valori (temporali) in esecuzione
ulimit
comando o modifica (permanente)/etc/security/limits.conf
.sys.kernel.threads-max
Questo valore è il numero di sistema globale (inclusi i processi non JVM) massimo di thread. Controllare
cat /proc/sys/kernel/threads-max
e aumentare se necessario.echo 999999 > /proc/sys/kernel/threads-max
o
sys.kernel.threads-max = 999999
in/etc/sysctl.conf
per cambiare in modo permanente.sys.kernel.pid_max
Se
cat /proc/sys/kernel/pid_max
è simile al limite di corrente, aumentare questo. Linux tratta i thread come i processi.echo 999999 > /proc/sys/kernel/pid_max
o
sys.kernel.pid_max = 999999
in/etc/sysctl.conf
per cambiare in modo permanente.E potrebbe essere necessario aumentare anche
sys.vm.max_map_count
.sys.vm.max_map_count
cat /proc/sys/vm/max_map_count
dovrebbe essere almeno (thread-count 2 x).Attempt to protect stack guard pages failed.
eOpenJDK 64-Bit Server VM warning: Attempt to deallocate stack guard pages failed.
i messaggi di errore vengono emessi da JavaThread :: create_stack_guard_pages() e chiama os :: guard_memory(). In Linux, questa funzione è mprotect().echo 1999999 > /proc/sys/vm/max_map_count
o
sys.vm.max_map_count = 1999999
in/etc/sysctl.conf
per cambiare in modo permanente.
@scsere persone lo fanno molto http://meta.stackexchange.com/questions/17463/can-i-answer-my-own-questions-even-if-i-knew-the-answer-before-asking – Ramanlfc
Ho passato alcune soluzioni solo questa offre la risposta che funziona! – javaPhobic
Ulteriori informazioni per sistemi Linux (systemd) moderni.
Ci sono molte risorse su questo di valori che potrebbero richiedere un tweaking (l'altra risposta è una buona fonte per la maggior parte di essi); tuttavia viene imposto un nuovo limite tramite il limite systemd "TasksMax" che imposta pids.max sul cgroup.
Per le sessioni di login il valore predefinito di UserTasksMax è il 33% del limite del kernel pids_max (in genere 12,288) e può essere sostituito in /etc/systemd/logind.conf.
Per i servizi il valore predefinito di DefaultTasksMax corrisponde al 15% del limite del kernel pids_max (in genere 4.915). È possibile sovrascriverlo per il servizio impostando TasksMax in "systemctl edit" o aggiornare DefaultTasksMax in /etc/systemd/system.conf
Mi ci sono voluti anni per trovare questo. FINALMENTE! Molte grazie! – Ben
è ragionevole? –
@ guillaumegirod-vitouchkina È successo su una macchina generatrice di carichi per prove di carico. A causa della cattiva progettazione della libreria legacy di terze parti, erano necessari più thread per connessione di rete. Quindi il conteggio dei thread è stato aumentato rapidamente. La maggior parte dei thread si trova in uno stato inattivo. – maczniak
OK. Capisco un simpatico. –