java.lang.OutOfMemoryError

java.lang.OutOfMemoryError : unable to create new native Thread: questo errore si presenta quando si cerca di avviare un applicativo java/scala con una specifica utenza e questa utenza non ha la possibilità di allocare il necessario numero di thread.

massimo numero di thread su una macchina linux:

simon@Itaca ~/vpn: cat /proc/sys/kernel/threads-max
254623

mentre analizzando nello specifica per l'utenza "simon" (con cui eseguo il comando):

simon@Itaca ~/vpn: ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 127311
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 127311
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

numero di processi running:

simon@Itaca ~/vpn: ps -elf | wc -l
272

mentre il reale numero di thread:

simon@Itaca ~/vpn: ps -elfT | wc -l 
901

per avere un elenco di thread in esecuzione da analizzare:

ps huH > elencothread.txt

Conclusioni: nello specifico i thread a mia disposizione sono ampiamente sufficienti, ma spesso negli ambienti enterprice si limita l'accesso alle risorse hardware per una specifica utenza di servizio, in quel caso la sequenza dei comandi proposti può aiutare ad eseguire una analisi per una eventuale segnalazione ai sistemisti.