Vous pouvez utiliser un exemple de programme pour connaître la limite actuelle de threads.
Si vous rencontrez Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread
, vérifiez-les :
-
Dans les petites machines à mémoire
Chaque thread Java consomme sa propre mémoire de pile. La taille de pile par défaut est 1024k (=1M). Vous pouvez réduire la taille de la pile comme
java -Xss512k ...
. La JVM ne peut pas être démarrée si la taille de la pile est trop faible.Et méfiez-vous des configurations de mémoire de tas :(initial)
-Xms
et (maximum)-Xmx
. Plus de mémoire est allouée au tas, moins il y a de mémoire disponible pour la pile. -
Limites du système
Quelques valeurs en
ulimit -a
peut affecter une limite de thread.max memory size
- illimité sur la plupart des machines 64 bitsmax user processes
- Linux traite les threads comme des processusvirtual memory
- illimité sur la plupart des machines 64 bits. l'utilisation de la mémoire virtuelle est augmentée par la configuration -Xss (par défaut 1024k)
Vous pouvez modifier ces valeurs en exécutant (temporairement)
ulimit
commande ou édition (permanente)/etc/security/limits.conf
. -
sys.kernel.threads-max
Cette valeur est le nombre maximal de threads global du système (y compris les processus non JVM). Vérifiez
cat /proc/sys/kernel/threads-max
, et augmentez si nécessaire.echo 999999 > /proc/sys/kernel/threads-max
ou
sys.kernel.threads-max = 999999
en/etc/sysctl.conf
changer définitivement. -
sys.kernel.pid_max
Si
cat /proc/sys/kernel/pid_max
est similaire à la limite de courant, augmentez-la. Linux traite les threads comme des processus.echo 999999 > /proc/sys/kernel/pid_max
ou
sys.kernel.pid_max = 999999
en/etc/sysctl.conf
changer définitivement.Et vous devrez peut-être augmenter
sys.vm.max_map_count
, aussi. -
sys.vm.max_map_count
cat /proc/sys/vm/max_map_count
doit être d'au moins (2 x nombre de threads).Attempt to protect stack guard pages failed.
etOpenJDK 64-Bit Server VM warning: Attempt to deallocate stack guard pages failed.
des messages d'erreur sont émis par JavaThread::create_stack_guard_pages(), et il appelle os::guard_memory(). Sous Linux, cette fonction est mprotect().echo 1999999 > /proc/sys/vm/max_map_count
ou
sys.vm.max_map_count = 1999999
en/etc/sysctl.conf
changer définitivement.
Informations supplémentaires pour les systèmes Linux modernes (systemd).
Il existe de nombreuses ressources à ce sujet sur les valeurs qui peuvent nécessiter des ajustements (l'autre réponse est une bonne source pour la plupart d'entre elles); cependant, une nouvelle limite est imposée par le biais de la limite systemd "TasksMax" qui définit pids.max sur le cgroup.
Pour les sessions de connexion, la valeur par défaut de UserTasksMax est de 33 % de la limite du noyau pids_max (généralement 12 288) et peut être remplacée dans /etc/systemd/logind.conf.
Pour les services, la valeur par défaut de DefaultTasksMax est de 15 % de la limite du noyau pids_max (généralement 4 915). Vous pouvez le remplacer pour le service en définissant TasksMax dans "systemctl edit" ou mettre à jour DefaultTasksMax dans /etc/systemd/system.conf
J'ai rencontré un problème similaire dans un programme Python et ce qui suit a fonctionné pour moi. Ceci est basé sur la réponse de maczniak ci-dessus et https://superuser.com/questions/1219960/cannot-edit-proc-sys-kernel-threads-max.
echo kernel.threads-max = 1073741823 >> /etc/sysctl.conf && echo 1073741823 > /proc/sys/kernel/threads-max
echo kernel.pid_max = 999999 >> /etc/sysctl.conf && echo 999999 > /proc/sys/kernel/pid_max
echo vm.max_map_count = 2147483646 >> /etc/sysctl.conf && echo 2147483646 > /proc/sys/vm/max_map_count
echo vm.overcommit_memory = 1 >> /etc/sysctl.conf && echo 1 > /proc/sys/vm/overcommit_memory
echo fs.inotify.max_user_instances = 256 >> /etc/sysctl.conf && echo 256 > /proc/sys/fs/inotify/max_user_instances
sysctl -p
J'ai également dû définir DefaultTasksMax
en /etc/systemd/system.conf
(ou /etc/systemd/user.conf
pour les services gérés par l'utilisateur) à DefaultTasksMax=unlimited
.
Systemd applique également une limite pour les programmes exécutés à partir d'un shell de connexion. Ceux-ci sont par défaut à 4096 par utilisateur (sera augmenté à 12288) et sont configurés en tant que UserTasksMax dans la section [Login] de
/etc/systemd/logind.conf
.
Cela vient de cette question StackExchange. Réglage de mon UserTasksMax
à UserTasksMax=999999
travaillé pour moi.