質問: こんにちは。 現在、私はNode.js×socket.ioを利用してリアルタイム通信用のサーバーを構築しています。 Node.jsもsocket.ioも今回が初めての初心者です。 Node.jsのプロセス管理にはpm2を利用しています。 Node.js v0.12.2 socket.io v0.9.17 pm2 v0.14.2 先日、完成したサーバーに対して負荷テストを実施したところ、 負荷をかけている最中はメモリ利用量がどんどん上昇していき、負荷をかけ終わったにも関わらずメモリ利用量が変わらないという状態になりました。 調べてみると、ソースコード上からGCを実行できることを発見したため試してみました。 ``` global.gc(); ``` きちんと上記のコードは実行されることを確認出来ましたが、対してメモリ利用量は変わりませんでした。 起動時 40MB程度 負荷テスト終わった後 80MB程度 GCが走った後 75MB程度 本当はソースコードを示せればいいのですが、事情で示すことが出来ません。 これは、ソースコードが悪いのでしょうか(GCで回収されないものがある)、それともこんなものなのでしょうか。 情報があまりないのですが、心当たり程度でもありがたいのでご教授いただけると助かります。 よろしくお願い致します。
回答: 一番ありそうな原因ですがクロージャーの中でイベントハンドラを登録するときに参照され続ける変数などがあるのではないでしょうか。 参照され続けていればGCされないのでメモリ使用量が減らないでしょう。 以下のwarningが出ていればその可能性は高いです。 ``` warning: possible EventEmitter memory leak detected. 11 listeners added. Use emitter.setMaxListeners() to increase limit. ``` 以上はJavaScriptをコーディングする際に注意が必要で、node.jsだけでなくフロントサイドでも起こり得ます。