136 votes

"java.lang.OutOfMemoryError: impossible de créer un nouveau thread natif"

Nous obtenons "java.lang.OutOfMemoryError : unable to create new native Thread" sur 8GO de RAM, VM, après 32k threads (ps -eLF| grep -c, java)

Toutefois, "top" and "free -m" shows 50% free memory available. JDk 64 bits et essayé avec les deux HotSpot et JRockit.Serveur Linux 2.6.18

Nous avons également tenté de OS stack size (ulimit -s) de réglages et max de processus(ulimit-u) limite, limite.conf augmentation mais en vain.

Aussi, nous avons essayé presque tous les possible de la taille de segment de mémoire combinaisons, maintien de la basse, haute, etc.

Le script que nous utilisons pour exécuter l'application est

/opt/jrockit-jdk1.6/bin/java -Xms512m -Xmx512m -Xss128k -jar JavaNatSimulator.jar /opt/tools/jnatclients/natSimulator.properties

Merci pour la réponse.

Nous avons essayé de l'édition de /etc/security/limits.conf et ulimit mais tout de même

[root@jboss02 ~]# 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) 72192
max locked memory       (kbytes, -l) 32
max memory size         (kbytes, -m) unlimited
open files                      (-n) 65535
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 72192
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

86voto

Ce n'est pas un problème de mémoire, mais un système d'exploitation de ressources de problème. Vous êtes à court de threads natifs, c'est à dire le nombre de threads que le système d'exploitation va permettre à votre JVM à utiliser.

C'est un problème rare, parce que vous aurez rarement besoin de beaucoup. Avez-vous beaucoup de inconditionnel fil de frai où le fils doit, mais ne la termine pas?

Vous pourriez envisager de réécrire en utilisant Callable/Runnables sous le contrôle d'un Exécuteur testamentaire, si possible. Il y a beaucoup de standard exécuteurs testamentaires avec divers comportement de votre code peut facilement contrôler.

(Il y a beaucoup de raisons pourquoi le nombre de threads est limitée, mais elles varient selon le système d'exploitation système d'exploitation)

8voto

Il est probable que votre système d'exploitation ne permettent pas le nombre de threads que vous essayez de créer, ou si vous êtes atteint une certaine limite dans la JVM. Surtout si c'est un chiffre rond comme 32k, une limite d'un genre ou d'un autre est très probable.

Êtes-vous sûr que vous avez vraiment besoin de 32k de threads? La plupart des langages modernes, une sorte de soutien pour les piscines de réutilisables threads - je suis sûr que Java a quelque chose en trop (comme ExecutorService, en tant qu'utilisateur Jesper mentionné). Vous pourriez peut-être demander des threads comme une piscine, plutôt que de créer manuellement de nouveaux.

7voto

P-H Points 167

Je recommande aussi de regarder la Taille de la Pile et voir si vous obtenez plus de threads créés. Par défaut la Taille de la Pile pour JRockit 1.5/1.6 est de 1 MO pour la version 64 bits virtuelle sur le système d'exploitation Linux. 32K de threads requièrent une quantité importante de mémoire physique et virtuelle à l'honneur cette exigence.

Essayez de réduire la Taille de la Pile à 512 KO comme un point de départ et de voir si elle aide à la création de plus de threads pour votre application. Je recommande aussi à explorer de mise à l'échelle horizontale par exemple, la division de votre application de traitement à travers plus des machines physiques ou virtuelles.

Lorsque vous utilisez une version 64 bits de VM, la limite réelle dépendra de l'OS mémoire physique et virtuelle de la disponibilité et de l'OS de réglage des paramètres tels que ulimitc. Je vous recommande l'article suivant comme référence:

OutOfMemoryError: impossible de créer un thread natif – Problème Démystifié

1voto

Pavan Kumar K Points 243

Si votre travail échoue à cause de OutOfMemmory sur les nœuds, vous pouvez modifier votre nombre maximal de cartes et de réducteurs et choisir la JVM pour chacun. mapred.child.java.opts (la valeur par défaut est 200Xmx) doit généralement être augmenté en fonction du matériel spécifique de vos nœuds de données.

Ce lien pourrait être utile ... vérifier

-5voto

Flueras Bogdan Points 1838

Tout d’abord, je ne voudrais pas trop reprocher à l’OS / VM ... mais plutôt au développeur qui a écrit le code qui crée tellement de Threads . Fondamentalement, quelque part dans votre code (ou tiers), de nombreux threads sont créés sans contrôle .

Examinez attentivement les stacktraces / code et contrôlez le nombre de threads créés. Normalement, votre application ne devrait pas nécessiter une grande quantité de threads, sinon, le problème est différent.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X