8

最近、開発用にhttps://github.com/lloyd/node-memwatchをインストールして、GCが私のプログラムとどのように相互作用するかを調査しました。

イベント「stat」をバインドしました。arthor は、GC が実行されたときにイベントがトリガーされると述べています。

スクリプトが高負荷の場合にそれが見つかりました。「統計」イベントはトリガーされません。GC が実行されていないことを意味するかどうかはわかりませんが、GC がトリガーされていない可能性があることを示しています。

私の運用サーバーでは、負荷は 1 日を通してさらに高くなります。GC が実行される可能性はないと確信しています。メモリ使用量が減少する可能性はありません。メモリリークと同じです。

  1. 私の観察は正しいですか?負荷が高い状態が続くと GC が実行できなくなるのですか?
  2. もしそうなら、公開された GC インターフェイスを使用して GC を強制する必要がありますか?
  3. GC がブロックされていますか? GC が各 GC で長時間ブロックされないように、GC をより頻繁に実行する必要がありますか?

手動 GC はお勧めできません (node.js で手動 GC のアイデアに反対する人がいますが、参照用のリンクが見つかりません) が、メモリ使用量が継続的に増加していることがわかります。それは本当に解決する必要があります。

4

1 に答える 1

3

V8 には 3 種類の GC イベントがあります

  • kGCTypeMarkSweepCompact
  • kGCTypeScavenge
  • kGCTypeAll

V8 はスカベンジ イベントを頻繁に実行しますが、新しく作成されたオブジェクトに対してのみです。負荷が高い場合、他のタイプの GC が頻繁に発生しないことがあります。

nodefly-gcinfo モジュールを使用して進行中のメモリ使用量を追跡するNodeFlyエージェントの実行を試すことができます。

nodefly-gcinfoGC イベントが発生するたびに実行されるコールバックを持つ、直接呼び出すこともできます。

require('nodefly-gcinfo').onGC(function(usage, type, flags){
    console.log("GC Event Occurred");
    console.log("Heap After GC:",usage, type, flags);
});
于 2013-01-20T04:49:46.510 に答える