ホームページ  >  記事  >  ウェブフロントエンド  >  Nodejs ガベージ コレクションの詳細な紹介

Nodejs ガベージ コレクションの詳細な紹介

不言
不言転載
2018-10-25 16:08:002150ブラウズ

この記事では、nodejs ガベージ コレクションについて詳しく説明します。必要な方は参考にしていただければ幸いです。

nodejs のガベージ コレクション メカニズムは、v8 エンジンによって自動的に管理されます。

nodejsのメモリ制限

一般的なバックエンド言語(php)ではメモリ使用量に制限はありませんが、 for nodejs システムの一部のみが使用可能であると言われています - 64 ビット システムの場合は 1.4G、32 ビット システムの場合は 0.7G。このとき、データ分析用に3Gのファイルを処理したい場合、システムメモリが8Gでもnodejsのプロセスメモリがオーバーフローしてしまいます。

上記の問題は主に、nodejs が v8 に基づいており、nodejs が v8 独自の方法でメモリを管理しているという事実によって発生します。では、なぜ v8 ではヒープ メモリのサイズが制限されるのでしょうか?理由は 2 つあります:

1. 表面的な理由: v8 はブラウザー用に設計されており、大量のメモリが必要になる可能性は低いです。

2. 深い理由: v8 ガベージ コレクション メカニズムの制限。 1.5G のヒープ メモリを例にとると、v8 では小規模なガベージ コレクションの実行に 50 ミリ秒、非増分ガベージ コレクションの実行に 1 秒かかります。ガベージ コレクションにより、js スレッドが一時停止し、アプリケーションのパフォーマンスと応答性が急激に低下します。

メモリ制限はオンにできます:
--max-old-space-size (旧世代)
--max-new-space-size (新世代)
v8ヒープ メモリ サイズ = 古い世代、新しい世代

v8 ガベージ コレクション メカニズム
v8 ガベージ コレクションは、主に generational ガベージ コレクション メカニズムに基づいています。メモリ ガベージ コレクションは、オブジェクトの生存時間に応じて異なる世代で実行され、メモリの異なる世代では異なるアルゴリズムが実行されます。

新世代--->生存時間の短いオブジェクト
旧世代--->生存時間の長いオブジェクトまたは常駐メモリ
前述のように、nodejsのヒープメモリのサイズは新世代のメモリ空間と旧世代のメモリ空間。

新世代のアルゴリズム
新世代では、主にガベージ コレクションにスカベンジ アルゴリズムが使用されます。

これはガベージコレクションを実現するためのコピー方法で、ヒープメモリを2つに分割し、それぞれの空間をセミスペースと呼びます。これら 2 つのセミスペースのうち、1 つだけが使用中 (スペースから呼び出される) で、もう 1 つは空きです (スペースに呼び出されます)。割り当てを開始するときは、まず from 空間から開始し、ガベージ コレクションが開始されると、生き残ったオブジェクトをチェックするために from 空間から開始し、生き残ったオブジェクトを to 空間にコピーします。そして、生き残っていないオブジェクトが占有している空間は、解放されます。コピーが完了すると、from スペースと to スペースの役割が逆転します。
上記のプロセスからわかるように、スカベンジの欠点は、ヒープ メモリの半分しか使用せず、スペースの取得時間が犠牲になることです。

古い世代は、マーク スイープ アルゴリズムとマーク コンコンパクト アルゴリズムを渡します。

マークスイープ マークの除去は、マーキングとクリアの 2 つの段階に分かれています。マークスイープは、まずマーキングフェーズでヒープメモリ内のすべてのオブジェクトを走査し、残っているオブジェクトをマークし、クリアフェーズでマークされていないオブジェクトをクリアします。スカベンジは生きているオブジェクトのみをコピーし、マークスイープは死んだオブジェクトのみをクリーンアップすることがわかります。新しい世代で生き残っているオブジェクトが占める割合は小さく、古い世代で死んだオブジェクトが占める割合は小さいため、これがこれら 2 つのアルゴリズムが効率的である理由です。

Mark-compact マーク構成では、リサイクル後、メモリが不連続な状態 (メモリの断片化) になります。メモリの断片化は、大規模なメモリを割り当てる必要があるが、すべてのメモリ フラグメントが割り当てを完了できない状況が発生するため、その後のメモリ割り当てに影響を及ぼします。これにより、事前にガベージ コレクションがトリガーされ、このリサイクルは不要になります。マーク コンパクトはマーク スイープをベースに進化したもので、その主な違いは、オブジェクトがマークされた後、残っているすべてのオブジェクトがソート プロセス中に一方の端に移動され、移動が完了した直後にクリアされることです。

要約: 通常の使用では、v8 のメモリ制限はまだ十分ですが、nodejs のガベージ コレクションとシングル スレッドは依然としてパフォーマンスに影響します。高いパフォーマンスが必要な場合は、ガベージ コレクションをできるだけ小さくする必要があります。実際の開発では、Webサービスのセッション(セッション)を実装する場合など、古い世代のオブジェクトを使用する必要があり、通常はメモリ上に格納(配列)されますが、アクセス数が多いと急激な増加につながります。古い世代のオブジェクトはオーバーフローを引き起こす可能性があります。 3G ファイルの読み取りなど、大きなメモリ データを処理する必要がある場合は、読み取り可能なストリームの Pipe() メソッドを使用します。これにより、v8 メモリ制限の影響を受けず、nodejs プログラムの堅牢性が向上します。

以上がNodejs ガベージ コレクションの詳細な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。