パイプ(やtty)への出力は、何らかの参照が内部に残る?

148 views
Skip to first unread message

KISHIMOTO, Makoto

unread,
May 7, 2014, 11:57:50 PM5/7/14
to node...@googlegroups.com
きしもとと申します

以下のようなサンプルを、
https://gist.github.com/metanest/827742e949278269ed56

$ node --expose_gc --always_compact sample.js > /dev/null
のように process.stdout._type で得られる出力先を fs にして
走らせると特に問題ないのですが、

$ node --expose_gc --always_compact sample.js | cat > /dev/null
のように出力先が pipe (あるいはリダイレクトせず、端末 (tty) に出力)
の場合、node を実行しているプロセスのメモリの使用量がどんどん増えて
いきます。

process.stdout 等で、出力先が pipe(等)の場合、何らかの情報への
参照が内部に残るのでしょうか?

Shigeki Ohtsu

unread,
May 8, 2014, 12:34:42 AM5/8/14
to node...@googlegroups.com
大津です。

まさにNodeのメモリリーク対策
http://d.hatena.ne.jp/jovi0608/20120809/1344474864 の記事に書いた、

https://github.com/joyent/node/issues/3648

と同じじゃないですかね?

write の callback が同一tick内で溜まるからメモリが増大するということで、
リークではないとの結論です。

KISHIMOTO, Makoto

unread,
May 8, 2014, 1:39:15 AM5/8/14
to node...@googlegroups.com
On Thu, 08 May 2014 13:34:42 +0900
Shigeki Ohtsu <oh...@iij.ad.jp> wrote:
> 大津です。
>
> まさにNodeのメモリリーク対策
> http://d.hatena.ne.jp/jovi0608/20120809/1344474864 の記事に書いた、
>
> https://github.com/joyent/node/issues/3648
>
> と同じじゃないですかね?
>
> write の callback が同一tick内で溜まるからメモリが増大するということで、
> リークではないとの結論です。

検索していてその issue を見た時は single tick というのがいまいち
掴めなかったのですが、nextTick で検索してだいたいわかりました。

無限ループの類は直接書いてしまうとまずくて、

var loop = function () {
sample()
setTimeout(loop, 0)
}
loop()

のようにする必要があるわけですね。

Shigeki Ohtsu

unread,
May 8, 2014, 2:12:12 AM5/8/14
to node...@googlegroups.com
大津です。

> 検索していてその issue を見た時は single tick というのがいまいち
> 掴めなかったのですが、nextTick で検索してだいたいわかりました。

現状 process.nextTick() はAPI名と動作が不一致な挙動なので、Node-v0.11系
ですが、先日のNode学園の発表資料の p14 にあるイベントループの図を見てい
ただければ、もうちょっとTickをイメージしやすいかと。

http://www.slideshare.net/shigeki_ohtsu/node-v012tng12

ちゃんと動作確認していませんが、一回 I/Oイベントを超えればおそらくメモリ
は解放されるでしょう。

> 無限ループの類は直接書いてしまうとまずくて、
>
> var loop = function () {
> sample()
> setTimeout(loop, 0)
> }
> loop()
>
> のようにする必要があるわけですね。
>

timer値 0 の setTimeout() でもいいですが、 setImmediate() の方がよりイベ
ントループを意識できるかと思います。
Reply all
Reply to author
Forward
0 new messages