2016-04-23 6 views
0

buf.slice([]終わり、[開始])のNode.jsバッファガベージコレクション

は、元と同じメモリを参照するが、オフセットおよび開始および終了インデックスでトリミング新しいバッファを返します。

新しいバッファスライスを変更すると、2つのオブジェクトの割り当てられたメモリが重複するため、元のバッファのメモリが変更されることに注意してください。

参照の1つがなくなった場合、ガベージコレクタは割り当てられたメモリをどのように処理しますか?

答えて

2

バッファでスライスを実行すると、異なるポイントで開始し、終了する元のバッファへの新しい参照を作成するだけです。

元のバッファを変更すると、スライスされた参照も変更されます。

これは、すべての参照(スライスされているかどうか)がなくなるまで、メモリーのチャンク全体がガベージコレクションに使用できないことを意味します。

これはあなたの質問にお答えします。

+0

私は、スライスされたバッファが最初に割り当てられたメモリを保持し、スライスされた部分だけを利用可能にすると仮定します。 –

+0

うん、まさにその –

0

Node.jsバッファのドキュメントから: "既存のバッファの上に、バッファ#slice()の実装によりビューが作成され、バッファ#slice()の効率が大幅に向上します。"これは、バッファが同じメモリ位置を参照してオーバーラップすることを意味します。バッファへのすべての参照が削除されると、メモリはガベージコレクタ(gc)によって再割り当てできます。 gcが実行されると、参照のないバッファが削除され、それぞれのプールにメモリが返されます。

ノードバッファの初期化方法によって動作が異なります。新しいBuffer()メソッドを使用した場合、それらは廃止され、ドキュメントを再訪する必要があります。バッファalloc()、bufferUnsafe()およびbufferUnsafeSlow()メソッドを使用する必要があります。