you21979の日記

実験ネタとか。仮想化とかnodejsで嵌った所とかおもしろかったところとかいろいろ

node.jsのガベコレ

よくメモリリークしてるとか言われているがどういうときに起こるか

そもそもnode.jsのガベコレは他のガベコレと同じようにリアルタイムアプリケーション作る場合によくやるフレーム毎にGC処理をコールしてやる必要がある(UNITY,AS3など)

これをやらないと高負荷な状況でGCをサボるのでメモリリークしているようにみえる。(キューに処理がつまれていって一度に処理する回数が少ないのでパンクするようなもの)

手動でGCをやるには↓のようにする

$ vi node_server
 #!/bin/bash
 node --expose_gc $@

setTimeoutなりprocess.nextTickとかで↓をコールする。

if( global.hasOwnProperty('gc') ){
 global.gc();
}

 

他に起こるとしたら循環参照だけどこれは気をつけるしかない

nodejsのV8は世代別GCを採用しているので↓の説明が参考になる

http://ja.wikipedia.org/wiki/%E3%83%9E%E3%83%BC%E3%82%AF%E3%83%BB%E3%82%A2%E3%83%B3%E3%83%89%E3%83%BB%E3%82%B9%E3%82%A4%E3%83%BC%E3%83%97

http://ja.wikipedia.org/wiki/%E4%B8%96%E4%BB%A3%E5%88%A5%E3%82%AC%E3%83%99%E3%83%BC%E3%82%B8%E3%82%B3%E3%83%AC%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3

↓これはすこし古いかも

http://msdn.microsoft.com/ja-jp/library/bb250448%28VS.85%29.aspx

 

単純な循環参照であればV8のGCはそのうち片付けてくれる

 

大抵はイベントリスナに登録するイベントハンドラかな。

eventemitterとかeventemitterとかeventemitterなもの