Serveur minecraft

Dépannez OutOfMemoryError: impossible de créer un nouveau thread natif – Resoudre les problemes d’un serveur MineCraft

Par Titanfall , le 8 janvier 2020 - 8 minutes de lecture

Il existe 8 versions de java.lang.OutOfMemoryError. Dans ces 8 saveurs java.lang.OutOfMemoryError: impossible de créer un nouveau thread natif est l'une des saveurs les plus courantes. Ce type de OutOfMemoryError est généré lorsqu'une application n'est pas en mesure de créer de nouveaux threads. Cette erreur peut apparaître pour les deux raisons suivantes:

  1. Il n'y a pas de place dans la mémoire pour accueillir de nouveaux threads.
  2. Le nombre de threads dépasse la limite du système d'exploitation.

Solutions

Il existe 6 solutions potentielles pour résoudre ce problèmejava.lang.OutOfMemoryError: impossible de créer un nouveau thread natif' Erreur. Selon l'événement qui déclenche cette erreur, une ou plusieurs des solutions mentionnées ci-dessous peuvent être appliquées pour résoudre le problème

1. Fixer le taux de création de threads

Quand tu vois 'java.lang.OutOfMemoryError: impossible de créer un nouveau thread natif », vous devez diagnostiquer si l'application a commencé à créer plus de threads. Vous pouvez utiliser l'outil d'analyse de vidage de threads en ligne tel que http://fastthread.io/ (que je recommanderais fortement), pour voir combien de threads sont créés? Quelle est la trace de pile de ces threads excessivement créés? Qui les crée? Une fois que vous connaissez ces questions, il est facile de les résoudre. Consultez la section "Exemple du monde réel" de cet article, qui passe par un "java.lang.OutOfMemoryError: impossible de créer un nouveau thread natif » problème a rencontré une application de voyage B2B majeure et comment l'outil http://fastthread.io/ a été utilisé pour diagnostiquer le problème.

2. Augmentez les limites de thread définies sur le système d'exploitation

Le système d'exploitation a des limites pour le nombre de threads qui peuvent être créés. La limite peut être trouvée en émettant "ulimit –u”Commande. Sur certains serveurs, j'ai vu cette valeur définie sur une valeur faible telle que 1024. Cela signifie que seulement 1024 threads peuvent être créés sur cette machine. Donc, si votre application crée plus de 1024 threads, elle va s'exécuter java.lang.OutOfMemoryError: impossible de créer un nouveau thread natif.Dans de telles circonstances, augmentez cette limite.

3. Allouez plus de mémoire à la machine

Si vous ne voit pas un grand nombre de fils créé et «ulimit –u"La valeur est bien en avance, alors cela indique que votre application s'est développée de manière organique et a besoin de plus de mémoire pour créer des threads. Dans ce cas, allouez plus de mémoire à la machine. Cela devrait résoudre le problème.

4. Réduisez l'espace de stockage

Un point très important que même les ingénieurs chevronnés oublient est: les threads ne sont pas créés dans le tas JVM. Ils sont créés en dehors du tas JVM. Donc, s'il reste moins de place dans la RAM, après l'allocation de tas JVM, l'application s'exécutera dans java.lang.OutOfMemoryError: impossible de créer un nouveau thread natif. Considérons donc cet exemple:

Taille globale de la RAM

6 Go

Taille du tas (c'est-à-dire –Xms et –Xmx)

5 Go

Perm Gen size (i.e. -XX: MaxPermSize et -XX: MaxPermSize)

512 Mo

Selon cette configuration, 5,5 Go (c'est-à-dire 5 Go de tas + 512 Mo Perm Gen) sont utilisés par le tas JVM et ne laissent que 0,5 Go (c'est-à-dire 6 Go – 5,5 Go) d'espace. Notez dans cet espace de 0,5 Go – les processus du noyau, les autres processus utilisateur et les threads doivent s'exécuter. Cela peut ne pas être suffisant et il est probable que l'application commencera à connaître java.lang.OutOfMemoryError: impossible de créer un nouveau thread natif. Pour atténuer ce problème, vous pouvez envisager de réduire la taille de segment de mémoire de 5 Go à 4 Go (si votre application peut l'adapter sans rencontrer d'autres goulots d'étranglement de la mémoire).

5. Réduisez le nombre de processus

Cette solution est assez similaire à «Réduire l'espace de tas». Examinons ce scénario, où vous exécutez plusieurs processus sur un serveur qui est contraint par la mémoire. Dire:

Taille globale de la RAM

32 Go

Nombre de processus Java sur le serveur

5

Taille de segment de chaque processus Java

6 Go

Cela signifie qu'au total, tous les processus Java occupent 30 Go (soit 5 processus X 6 Go) de mémoire. Il ne laisse que 2 Go pour les processus du noyau, les autres processus utilisateur et les threads à exécuter. Cela peut ne pas être suffisant et il est probable que l'application commencera à connaître java.lang.OutOfMemoryError: impossible de créer un nouveau thread natif. Dans ce cas, il est préférable d'exécuter uniquement 4 processus java sur un serveur. Ainsi, seuls 24 Go sont occupés (4 processus X 6 Go) et il reste 8 Go (soit 32 Go – 24 Go) de mémoire. Cela peut laisser suffisamment de place aux threads et exécuter d'autres processus.

6. Réduisez la taille de la pile de threads (-Xss)

Un thread occupe la mémoire en RAM. Donc, si chaque thread a une allocation de mémoire élevée, la consommation de mémoire globale augmentera également. La valeur par défaut de la taille de la mémoire d'un thread dépend du fournisseur JVM. Dans certains cas, c'est 1 Mo. Donc, si votre application a 500 threads, les threads à eux seuls occuperont 500 Mo d'espace.

Cependant, vous pouvez utiliser la propriété système java –Xss pour définir la taille de la mémoire du thread. En utilisant cette propriété, vous pouvez réduire la taille de la mémoire. Exemple si vous configurez -Xss256k, vos threads ne consommeront que 125 Mo d'espace (soit 500 threads X 256k). Ainsi, en réduisant également la taille de –Xss, vous pourrez peut-être éliminer java.lang.OutOfMemoryError: impossible de créer un nouveau thread natif.

MISE EN GARDE: Cependant, si vous configurez –Xss sur une valeur très faible, vous commencerez à rencontrer java.lang.StackOverflowError. Si vous configurez à une valeur encore plus faible, JVM ne démarre même pas.

Exemple du monde réel

Maintenant, laissez-moi vous présenter un exemple concret de java.lang.OutOfMemoryError: impossible de créer un nouveau thread natif, que j'ai diagnostiqué récemment. Cette erreur a été rencontrée par une importante application de voyage B2B en Amérique du Nord. Aucun déploiement de production récent n'a été fait pour cette application, mais tout d'un coup, elle a commencé à jeter java.lang.OutOfMemoryError: impossible de créer un nouveau thread natif.

Étape 1: Dans un premier temps, nous avons capturé le vidage de thread de l'application lorsqu'elle rencontrait ce problème. java.lang.OutOfMemoryError: impossible de créer un nouveau thread natif. Ensuite, nous avons téléchargé le vidage de thread dans l'analyseur de vidage de thread en ligne http://fastthread.io/.

Étape 2: L'outil http://fastthread.io/ a signalé que l'application avait 3216 threads vivants et a souligné à juste titre que cela peut entraîner java.lang.OutOfMemoryError: impossible de créer un nouveau thread natif. 3000+ threads était un nombre de threads très élevé pour cette application, ce qui est au moins 6 fois plus que la période régulière.

Titre de l'image

Figue 1: http://fastthread.io/ outil montrant le résumé du nombre de threads

Étape 3: Depuis, il est confirmé que les threads excessifs provoquent java.lang.OutOfMemoryError: impossible de créer un nouveau thread natif, l'étape suivante consiste à identifier quels sont ces fils créés de manière excessive? Et qui les crée? L'outil http://fastthread.io/ a une section «Répétition des traces de pile», dans laquelle les threads avec les mêmes traces de pile sont regroupés. Dans cette section, nous avons remarqué que 2319 threads (soit 72%) présentent la même trace de pile comme indiqué sur la figure 2.

Titre de l'image

Fig 2: http://fastthread.io/ outil montrant un groupe de threads qui ont la même trace de pile

Titre de l'image

Fig 3: trace de pile de thread individuel tel que rapporté par l'outil http://fastthread.io/

De la trace de la pile, nous avons déduit que ces threads créés sont par le pilote Datastax. Cette application utilise le pilote DataStax pour se connecter à la base de données Apache Cassandra NoSQL. Alors maintenant, la question devient soudainement pourquoi le pilote Datastax a commencé à créer autant de threads? Aucune mise à niveau n'a été apportée à ce pilote. Aucun déploiement récent n'a été effectué sur l'application. Pourquoi tout d'un coup ce problème a commencé?

Cause première: Apparemment, le problème s'est avéré qu'Apache Cassandra NoSQL DB rencontrait un problème d'espace disque sur l'un de ses nœuds. Ce problème a provoqué le pilote Datastax pour générer des milliers de threads. Ainsi, il a java.lang.OutOfMemoryError: impossible de créer un nouveau thread natif erreur du côté JVM. Lorsque plus d'espace a été alloué aux nœuds de base de données Apache Cassandra NoSQL, le problème a été résolu.

Click to rate this post!
[Total: 0 Average: 0]

Commentaires

Laisser un commentaire

Votre commentaire sera révisé par les administrateurs si besoin.