2016-08-22 4 views
1

私はキューとして使用配列のシーンを持っており、私はこのシーンのメモリについて質問しています。Javascript/Node.js配列メモリ管理

まず、グローバルに配列オブジェクトを作成し、要素を無条件に配列にプッシュするプロデューサを作成します。

var arr = []; 

function runningProducer() { 
    setInterval(itemProducer, 50); 

    function itemProducer() { 
    var item = generateItem(); 
    arr.push(item); 
    } 
    function generateItem() { 
    return { a: Math.random(), }; 
    } 
} 

はその後、私は1秒

function runningCustomer() { 
    setInterval(clearQueue, 1000); 

    function clearQueue() { 
    var t = arr.concat(arr); 
    arr = []; 
    } 
} 

で配列をクリアして、一定の期間については、上記の機能を実行するために顧客を作成し、私はメモリが常に成長しました。

私は配列が空になった後にメモリを解放すべきだと思いますが、そうではないと思います。 私はこの質問についていくつかのsuggetionsを教えてください、そして、JavaScriptを手動でメモリを解放する方法はありますか?

+4

ガベージコレクタの実行時にメモリが消去されます。アレイを空にするとすぐには消去されません。 – Barmar

+1

'var t = arr.concat(arr);とは何ですか? 't'変数が他の場所で参照されていない場合は、行全体が冗長ですが、どこかで*参照されている場合(何らかの理由でコードに表示されていない)、その配列への参照(' arr'のサイズの2倍)まだ存在するので、メモリを使用し続けます。 – nnnnnn

+1

プロデューサがアレイを使用しているため、メモリからアレイをクリアすることはできません。 –

答えて

3

この質問に対する回答は、Barmarのコメントです。予約されたメモリは、もはや必要なくなった瞬間にすぐに解放されません。 JavaScriptはガベージコレクションを利用して未使用の参照を検出し、ヒープに戻しますが、ガベージコレクションは高価な手順なので、しばらく毎回実行されます。

コードを実行しようとすると、メモリ使用量が1〜2分増加し、ガベージコレクション実行時に突然元の値に戻ります。おそらく、ログを十分に長く見ていないのでしょうか?

手動でガベージコレクションを実行し、自分のためにこれを見--expose-gcフラグでノードを実行しているとglobal.gc()を実行することではなく、あなたが非常に正当な理由がない限り、あなたはないは、生産コードでこれを行う必要がありますすることができます。

+0

少しの問題がある、私は使用メモリが元のメモリ値に戻って行くことがわかったが、それはオリジナルより少し多く、約10kbになります。それが毎回これのようなものです。 – kenticny