NodeJS : Comment déboguer “EventEmitter fuite de mémoire détecté. 11 auditeurs ajoutée”
Comment puis-je déboguer mon application qui affiche cette erreur:
(node) warning: possible EventEmitter memory leak detected. 11 listeners added. Use emitter.setMaxListeners() to increase limit.
Trace
at Socket.EventEmitter.addListener (events.js:160:15)
at Socket.Readable.on (_stream_readable.js:653:33)
at Socket.EventEmitter.once (events.js:179:8)
at TCP.onread (net.js:527:26)
Je ne pouvais pas trouver de l'hypothèse d'une fuite de l'objet pour l'augmentation de l'auditeur limite par .setMaxListeners(0);
SOLUTION (à partir de fardjad et jan salawa)
Avec jan salawa de recherches j'ai trouvé un travail de bibliothèque (longjohn) pour augmenter les traces de pile détaillé. Avec fardjad la réponse que j'ai trouvé que nous avons pour le prototype EventEmitter.addListener
ET EventEmitter.on
.
Avec la solution que je pourrais obtenir cette nouvelle trace:
(node) warning: possible EventEmitter memory leak detected. 11 listeners added. Use emitter.setMaxListeners() to increase limit.
Trace
at EventEmitter.addListener.EventEmitter.on (xxx/main.js:44:15)
at Readable.on (_stream_readable.js:653:33)
at ServerResponse.assignSocket (http.js:1072:10)
at parser.onIncoming (http.js:1979:11)
at parserOnHeadersComplete (http.js:119:23)
at socket.ondata (http.js:1912:22)
at TCP.onread (net.js:510:27)
- Check this out à propos de l'agent.maxSockets weblog.bocoup.com/node-stress-test-analysis . Peut-être que c'est une cause.
- Essayé, sans succès. J'ai mis
require("http").globalAgent.maxSockets = Infinity;
à mon main.js mais rien n'a changé ... 🙁 j'ai aussi essayéulimit -n 999999
de commande pour ouvrir le fichier limite et-–nouse-idle-notification
pour suspension en temps réel garbage collector ... - Cela a complètement raccroche mon nœud de serveur js comme une exception lors de l'exécution sur le plan local lorsque j'appuie sur ctrl + C autre traitement de démarrer. J'ai essayé de réglage maxListeners pas utiliser, Qu'est-ce qu'il dit est-il que j'ai aussi beaucoup de gars connectés à la même auditeurs ou est-il en me disant que j'ai trop d'événements
Vous devez vous connecter pour publier un commentaire.
Il s'avère que c'est un bug dans nodejs, nous parlons de ce problème ici : https://github.com/joyent/node/issues/5108
Solution pour buggé serveurs http thats jeter un
EventEmitter memory leak detected
et remplir la mémoire disponible /disponibles en temps de calcul :Revenir à l'ancienne version
v0.8.23
. (Vous pouvez télécharger et installer/compiler à partir d'ici : http://blog.nodejs.org/2013/04/08/node-v0-8-23-legacy/)Mise à JOUR 2018 : je vois plusieurs retours sur ce sujet alors que le problème semble avoir disparu depuis des années. Notez que cette réponse est seulement pour une fuite d'un serveur http de construire avec nodejs. Si vous êtes dans un autre scénario, s'il vous plaît regarder les autres réponses sur ce fil et ne pas faire le downgrade de version (comme l'a suggéré sur cette réponse), vous perdrez votre temps.
v6.10.0
, mnp:4.6.1
Toujours de voir ça maintenant 🙁Pour moi, ça ressemble à la boucle d'événement est bloqué. Cela peut se produire si vous faites l'uc tâches node.js boucle d'événements. Vous pouvez utiliser processus enfant faire tâche intensive.
Vous pouvez vérifier ce qui est bloquant node.js à l'aide de méthodes suivantes:
1
ne Pourrais pas obtenir de travail intéressante pour la arpentage.2
rien ici aussi, il y a déjà 0 durée.3
profil est trop vieux et ne pouvait pas le faire fonctionner avec le noeud v0.10.4
Je suis en train de l'utiliser pour les bas niveau debogging. (Je suis edditing mon post original)C'est exactement ce qui m'est arrivé. Pour moi, je imbriquée un écouteur d'événement dans un autre écouteur d'événement accidentellement.
Regardez votre code et assurez-vous que vous N'avez PAS un écouteur d'événement bloc DANS un autre écouteur d'événement bloc par exemple(à moins que vous le faites exprès):
Dans le mauvais exemple ci-dessus, le socket.sur ('close') l'auditeur doit être en DEHORS de la prise.sur('data') bloc.
Dans mon cas, lorsque j'ai reçu 5 flux de données, de la prise de courant.sur ("fermer") auditeur est en attente pour un gros événement se produise. Quand je ferme une fois, une autre 4ème événement de clôture à l'exécution. Ce n'est clairement pas ce que je voulais. Cela est dû à la nature de Node.js ce qui est non-bloquante. Il mémorise les événements dus à la fonction de rappel.
somereaderstream.on("close", function(){ fstream.Reader({ 'path': basepath, 'type': 'Directory' }).on("end", function(){ ..... }); }); Thanks for pointing out!
À crochet
addListener
vous pouvez faire quelque chose comme ceci:addListener
sorcière de feu l'erreur de ne pas exécuter le crochet (j'ai essayé de vous tous listerners retrait de l'état). Est-ce crochet de fixation sur les modulesevents.EventEmitter.addListener
? (peut-être que le problème vient d'un "mauvais" module j'utilise ?)node.js
caches modules. De multiples tentatives derequire
un module (normalement) charge le module une fois. Donc, si vous installez le crochet de votre script principal, d'autres modules devraient utiliser accrochéaddListener
.EventEmitter.addListener
ETEventEmitter.on
en même temps.Cette alerte sera levée si vous vous inscrivez à un événement particulier, d'un même objet à plus de 11 fois.
Vérifier si vous avez de la " sur " appel à particulier de l'événement dans une fonction que vous appelez fréquemment, ce qui conduit à l'inscription pour un événement à plusieurs reprises.
Cette lien m'a aidé à le comprendre.
Depuis le nœud 6, vous devez utiliser
node --trace-warnings
: https://nodejs.org/api/cli.html#cli_trace_warningsJ'ai rencontré le même problème lors de l'essai de Réagir composants à l'aide de moka et enzyme.
J'ai pu résoudre mon problème en faisant explicitement le démontage des composants après que j'ai fini les tests.
Le problème était que j'étais composants de montage à plusieurs reprises dans mes tests, qui ont été l'ajout de plus d'auditeurs, jusqu'à ce que le nombre d'auditeurs ai 11 ans, et j'ai reçu un avertissement.
J'ai changé mon code de test en ajoutant le rendus.démonter() ligne. Le problème est résolu pour moi.