56

このエラーをスローするアプリケーションをデバッグするにはどうすればよいですか:

(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)

リスナーの制限を増やすために想定されるリークオブジェクトを見つけることができませんでした .setMaxListeners(0);

SOLUTION (fardjad と jan salawa より)

jan salawa の検索で、詳細なスタック トレースを増やすための作業ライブラリ ( longjohn ) を見つけました。EventEmitter.addListener fardjad の応答により、 AND のプロトタイプを作成する必要があることがわかりましたEventEmitter.on

ソリューションを使用すると、次の新しいトレースを取得できます。

(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)
4

8 に答える 8

32

これは nodejs コアのバグであることが判明しました。ここでこの問題について話しています: https://github.com/joyent/node/issues/5108

EventEmitter memory leak detectedをスローして利用可能なメモリ/利用可能なCPU時間をいっぱいにするバグのあるhttpサーバーの解決策:

レガシー バージョンに戻しますv0.8.23。(ここからダウンロードしてインストール/コンパイルできます: http://blog.nodejs.org/2013/04/08/node-v0-8-23-legacy/ )

UPDATE 2018 :このトピックに関するフィードバックがいくつかありますが、問題は何年も前からなくなっているようです。この応答は、 nodejs を使用したリークのある http サーバー ビルドのみを対象としていることに注意してください。他のシナリオにいる場合は、このスレッドの他の回答を確認し、(この回答で提案されているように) バージョンをダウングレードしないでください。時間を無駄にします。

于 2013-04-25T18:28:30.257 に答える
12

私にとっては、イベント ループがブロックされているようです。これは、node.js イベント ループで CPU を集中的に使用するタスクを実行している場合に発生する可能性があります。子プロセスを使用して集中的なタスクを実行できます。

次の方法を使用して、node.js をブロックしているものを確認できます。

  1. 各呼び出しの計算時間を測定します。時間が長い場合はログに記録して、アプリが正しく動作していないことを確認します。
  2. ログ スケジュールを設定して、何かがループをブロックしていることがわかるようにします
    function timeTick() {
        var startTime = (new Date().getTime());
        function onTick() {
            var interval = (new Date().getTime()) - startTime;
            if(interval > 5)
                console.log('timeTick(): WARNING: interval = ' + interval);
        }
       process.nextTick(onTick);
    }
    setInterval(timeTick, 1000);
  3. プロファイルを使用します。
  4. これをロギングとプロファイリングに使用します。Nodejitsuで使用されるライブラリです。
于 2013-03-25T14:49:32.860 に答える
7

この警告は、同じオブジェクトの特定のイベントに 11 回以上登録するとスローされます。

頻繁に呼び出している関数で特定のイベントの「オン」呼び出しがあるかどうかを確認してください。これにより、イベントが複数回登録されます。

このリンクは、これを理解するのに役立ちました。

于 2015-10-21T08:49:58.357 に答える
6

ログメッセージを addListener に追加するために EventEmitter のプロトタイプを作成しようとしましたが、うまく動作しませんでした

フックaddListenerするには、次のようなことができます。

// on the first line of your main script
var events = require("events"),
    EventEmitter = events.EventEmitter;

var originalAddListener = EventEmitter.prototype.addListener;
EventEmitter.prototype.addListener = function (type, listener) {
    if (this.listenerCount(this, type) >= 10) {
        // TODO: PLACE YOUR CODE FOR DEBUGGING HERE
    }
    originalAddListener.apply(this, arguments);
}
于 2013-03-23T12:47:11.703 に答える
-1

モカ酵素を使用してReactコンポーネントをテストしたときに、同じ問題に遭遇しました。

コンポーネントのテストが終了した後、コンポーネントを明示的にアンマウントすることで問題を解決できました。

問題は、テストでコンポーネントを複数回マウントしていて、リスナーの数が 11 になるまでリスナーを追加していたことで、警告が表示されました。

render.unmount()行を追加して、テスト コードを変更しました。これで問題は解決しました。

describe('<CircleArc />', () => {

    it('renders', function () {
        const rendered = mount(<CircleArc />);
        assert.ok(rendered.find('path'));
        rendered.unmount();
    });
}
于 2016-04-05T17:48:58.303 に答える