Question

Je simule une surcharge d'un serveur et j'obtiens cette erreur:

java.lang.OutOfMemoryError: unable to create new native thread

J'ai lu dans cette page http://activemq.apache.org/javalangoutofmemory.html" rel="noreferrer"> http://activemq.apache.org/javalangoutofmemory.html, que je puisse augmenter la taille de la mémoire. Mais comment je fais ça? Quel fichier je dois modifier ,? J'ai essayé de passer les arguments par le script bin / activemq mais sans succès.

Était-ce utile?

La solution

Votre cas correspond à nombre massif de fils . Il y a 3 façons de le résoudre:

  • réduisez le nombre de threads ( -Dorg.apache.activemq.UseDedicatedTaskRunner = false dans le document)
  • réduisez la taille de la pile par thread par l'option -Xss (valeurs par défaut: 320 Ko pour Java 32 bits sous Win / Linux, 1024 Ko pour Java 64 bits sous Win / Linux, voir < a href = "http://www.oracle.com/technetwork/java/hotspotfaq-138619.html#threads_oom" rel = "nofollow noreferrer"> doc )
  • réduisez ( pas l'extension ) la taille de tas -Xmx pour créer une pièce pour les piles par thread (512 Mio par défaut dans le script ActiveMQ)

Remarque : Si la pile ou le segment de mémoire est trop petit, cela doit provoquer une autre erreur OutOfMemoryError .

.

Vous pouvez les spécifier à l'aide de la variable shell ACTIVEMQ_OPTS (sous UNIX). Par exemple, exécutez ActiveMQ en tant que

ACTIVEMQ_OPTS=-Xss160k bin/activemq

Autres conseils

à vérifier ici

Spécifiez l'argument -Xmx à la machine virtuelle qui exécute ActiveMQ - Tomcat, par exemple.

Vous pouvez attribuer plus de mémoire à la machine virtuelle Java à l'aide de l'argument de commande -Xmx .
Par exemple. java -Xmx512M MyClass

Nous étions confrontés à ce problème sur un système Linux (RedHat Enterprise 5) et nous avons découvert que, sur cette construction, nprocs ulimit dans /etc/security/limits.conf contrôlait en réalité le nombre de threads a l'utilisateur peut apparaître.

Vous pouvez afficher cette limite à l'aide de la commande ulimit -a .

Hors de la boîte, cela a été défini à une limite souple de 100 et une limite stricte de 150, ce qui est terriblement en deçà du nombre de threads nécessaires pour exécuter un serveur d'applications moderne.
Nous avons totalement supprimé cette limite et le problème a été résolu pour nous.

Cela ne donne pas l’impression que vous manquez d’espace de mémoire, ne l’augmentez pas (option -Xmx). Au lieu de cela, votre application manque de mémoire de processus et en diminuant l’espace de segment de mémoire libérera de la mémoire de processus pour une utilisation native. La question est de savoir pourquoi vous utilisez autant de mémoire de processus. Si vous n'utilisez pas JNI, vous avez probablement créé trop de threads et le post de habe a expliqué comment résoudre ce problème.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top