Comment augmenter le nombre maximum de threads JVM (Linux 64bit)
Je ne peux pas créer plus de 32k threads Java en machine Linux avec 15G de mémoire.
source d'informationauteur maczniak
Vous devez vous connecter pour publier un commentaire.
Je ne peux pas créer plus de 32k threads Java en machine Linux avec 15G de mémoire.
source d'informationauteur maczniak
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser un exemple de programme pour trouver les threads en cours de limite.
Si vous rencontrez des
Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread
vérifiez ces:Dans les petites machines à mémoire
Chaque fil de Java consommer sa propre pile de la mémoire. Par défaut la taille de la pile est 1024k (= 1M). Vous pouvez réduire la taille de la pile comme
java -Xss512k ...
. La JVM ne peut pas être démarré si la taille de la pile est trop faible.Et méfiez-vous des tas de configurations de mémoire: (initial)
-Xms
et (maximum)-Xmx
. Plus la mémoire est allouée à tas, le moins de mémoire disponible pour la pile.Des limites du système de
Certaines valeurs dans
ulimit -a
peut affecter une limite de thread.max memory size
- illimité sur la plupart des machines 64 bitsmax user processes
- linux traite des fils comme des processusvirtual memory
- illimité sur la plupart des machines 64 bits. utilisation de la mémoire virtuelle est augmenté par -Xss de configuration (par défaut 1024k)Vous pouvez modifier ces valeurs par (temporelle) de l'exécution de
ulimit
de commande ou (permanente) de l'édition de/etc/security/limits.conf
.sys.kernel.threads-max
Cette valeur est le système global (y compris les non-JVM processus) nombre maximal de threads. Vérifier
cat /proc/sys/kernel/threads-max
et l'augmenter si nécessaire.echo 999999 > /proc/sys/kernel/threads-max
ou
sys.kernel.threads-max = 999999
dans/etc/sysctl.conf
de changer de façon permanente.sys.kernel.pid_max
Si
cat /proc/sys/kernel/pid_max
est similaire à la limite de courant, augmenter cette valeur. Linux traite des fils comme des processus.echo 999999 > /proc/sys/kernel/pid_max
ou
sys.kernel.pid_max = 999999
dans/etc/sysctl.conf
de changer de façon permanente.Et vous devrez peut-être augmenter
sys.vm.max_map_count
trop.sys.vm.max_map_count
cat /proc/sys/vm/max_map_count
doit être d'au moins (2 x thread-count).Attempt to protect stack guard pages failed.
etOpenJDK 64-Bit Server VM warning: Attempt to deallocate stack guard pages failed.
les 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
dans/etc/sysctl.conf
de changer de façon permanente.Des informations supplémentaires pour les modernes (systemd) les systèmes linux.
Il existe de nombreuses ressources sur ce de valeurs que peut besoin de peaufinage (l'autre réponse est une bonne source pour la plupart d'entre eux); toutefois, une nouvelle limite est imposée par voie de systemd "TasksMax" la limite qui définit les pids.max sur les cgroup.
Pour les sessions de connexion l' UserTasksMax par défaut est de 33% de la limite noyau pids_max (généralement 12,288) et peut être remplacer dans /etc/systemd/logind.conf.
Pour les services de la DefaultTasksMax par défaut est de 15% de la limite noyau pids_max (généralement 4,915). Vous pouvez le remplacer pour le service par la mise en TasksMax dans "systemctl modifier ou mettre à jour DefaultTasksMax dans /etc/systemd/system.conf