GCは、Node.jsのメカニズムを理解します

ノートを読んで「素人の言語のNode.js」の第5章、「メモリ制御」

ノードの発展に伴い、JavaScriptアプリケーションのシナリオは、もはやブラウザに限定されません。この記事では、短い時間を実行するために、Webアプリケーション、コマンドラインツールを議論し、唯一のエンドユーザーシナリオに影響しません。短い走行時間に、終了し、メモリ解放プロセスと、それはほとんど必要なメモリ管理ではありません。しかし、アプリケーションの広い範囲のサービス側のノードでは、JavaScriptのメモリ管理は私達の注意が必要です。

V8のメモリ制限

一般的なバックエンドの開発言語では、メモリで使用される塩基には限定されないが、ノードのJavaScript、32ビットシステムの使用を介して下(約1.4ギガバイト64ビットのシステム・メモリを使用するだけのメモリがありますおよそ0.7ギガバイト)。そのような制限の下では、直接大きなメモリオブジェクトを操作することはできませんノードになります。

問題の主な原因は、そのノードのJavaScript実行エンジンV8です。

V8では、すべてのJavaScriptオブジェクトをヒープから割り当てることがあります。ノードは、V8がメソッドを表示するために、メモリの量で使用提供しますprocess.memoryUsage()

  • heapTotal これは、ヒープメモリに適用しています
  • heapUsed ヒープメモリの現在の使用

なぜ、V8は、ヒープのサイズを制限するには:

  1. V8ブラウザは、多くのメモリを持つシーンを持つように設計された可能性は低いです
  2. V8のガベージコレクションメカニズムを制限します。(1.5ギガバイトの例に公式声明、ガベージコレクションヒープメモリによると、V8は、ガベージコレクションより少しを行う非インクリメンタルガーベジコレクションが1秒以上のものが必要か、50ミリ秒かかります)

我々はメモリサイズの使用を制御できるように、V8はオプションを提供します

  • node --max-old-space-size=1700 test.js MBのメモリ空間の旧世代の最大値を設定します。
  • node --max-new-space-size=1024 test.js 新世代のメモリの最大値は、KBに、設けられています。

申し訳ありませんが、この2つの最大値は、起動時に実行する必要があります。これは、V8が使用するメモリが自動的に状況に応じて使用を拡大する方法はありませんことを意味し、メモリ割り当てプロセス制限を超えたときとき、それはエラー処理が発生します。

V8のガベージコレクションメカニズム

V8ガベージコレクションのポリシーは、主に世代別ガベージコレクションのメカニズムに基づいています。V8では、新世代と旧世代二世代へのメインメモリ。オブジェクトの生存のために、比較的短い時間内のオブジェクトの新しい世代は、オブジェクトは古い世代より長く生きているオブジェクトまたは永続的なメモリ内にあります。

V8は、世代概略図であります

V8全体のヒープサイズは、メモリに加えて、メモリ空間古い世代の新世代です

アルゴリズムをスカベンジ

世代に基づき、新世代は、主によってオブジェクトをScavengeガベージコレクションアルゴリズム。具体的な実施の清掃では、主に使用Cheneyするアルゴリズム。

チェイニーアルゴリズムが採用のガベージコレクションのアルゴリズム方式のコピーです。それはあることを2、空間の各部分にヒープますsemispace両方semispaceスペースでは、一つだけは他のアイドルであり、使用されています。宇宙で使用されているSemispaceになるFromスペース、スペースがアイドル状態になるToスペース。私たちはより最初に、オブジェクトを割り当てるとスペースを割り当てます。ガベージコレクションを開始すると、オブジェクトによって占有生存空間がリリースされるのではなく、宇宙からのライブオブジェクトは、これらのオブジェクトの生存期間が空間ににコピーされます確認します。スペースから、コピーした後、および発生した空間を交換する役割。

欠点は唯一のヒープメモリの半分を使用することで捕捉するが、オブジェクトのコピーだけが生き残ったので掃気、及び対象の短いライフサイクルのための時間効率の点でのみ生きているシーンの小さな部分、それ卓越したパフォーマンスを占めています。掃気は時間アルゴリズムの典型的な犠牲スペースがすべての大規模なガベージコレクションに適用されますが、新しい世代での使用に非常に適してすることができないです。

ヒープメモリのV8図

プロモーション

古い世代に新しい世代からオブジェクトを移動プロモーションと呼ばれるプロセスで。

空間でのライブオブジェクトから前にスペースをコピーするには、チェックする必要がある、一定の条件の下で、それはオブジェクト内のオブジェクトに、旧世代の長期生存期間を移動させる必要があることは、完全なプロモーションです。

昇進のための2つの主要な条件があります。

  1. オブジェクトが回復掃気を経験したかどうか
  2. スペースに25%以上に使用されてきました

価値がある理由の25%をこの制限を設定すると、スカベンジ復旧が完了したとき、これはスペースから、次のメモリ割り当ては、このスペースで開催される割合が高すぎる場合、それは以降のメモリ割り当てに影響を与えるだろうにスペースになるだろうということです。

マーク・スイープ&マーク・コンパクト

旧世代のV8は、主にマーク・スイープ・モードを使用して、ガベージコレクションのマーク・コンパクトな組み合わせ。

マーク・スイープが明確な意味をラベル付けされ、それは2つの段階、マークとスイープに分かれています。ヒープトラバーサルマークフェーズ内のすべてのオブジェクトをマークスイープ、およびマークは、後続のパージ段階で生きているオブジェクトを、オブジェクトがマークを外していないだけです。

最大の問題は、スカベンジマークスイープは、メモリ空間が連続した状態でマークを作ることになりますではないです。状況は、大きなオブジェクトを割り当てる必要があるため、このメモリの断片化は、その後のメモリ割り当ての問題を引き起こしている発生する可能性があり、その後、スペースデブリのすべての割り当てを完了することができない、それは、ガベージコレクション、リサイクル、これをトリガするために進めていきますです不要。

マーク・スイープのメモリの断片化の問題を解決するために、マーク・コンパクトを提案しました。マーク・コンパクトは、段階的なマークスイープの基盤で、整理してから来て、タグの意味です。その差は、移動が完了した後の仕上げ工程では、運動の終わりに生きているオブジェクトは、境界の外側に直接メモリを一掃するとき、オブジェクトが死のためにマークされていることです。

次の表は、3つの主要なガベージコレクションアルゴリズムの単純な比較であります

選択は、V8マークスイープ空間で、主に使用されているので、その実行速度は、すぐにはできませんので、オブジェクトを移動するためのマーク・コンパクト必要があるため、表から、そしてマーク・スイープのMark-コンパクトの間で見られるようにマーク・コンパクトを使用して割り当てられたときに、オブジェクトの到来新しい世代から十分ではありません昇進。

マーキングインクリメンタル

アプリケーションロジックを回避し、一貫性のないJavaScriptのガベージコレクタは、ガベージコレクションのアルゴリズムの3種類の出現は、アプリケーションロジックを一時停止する必要が見るためには、この動作は、「ピリオド」(ストップ-世界)と呼ばれています。

新世代の小さなスペース構成、あまりライブオブジェクトに、完全な停止が新世代にほとんど影響を与えません。しかし、旧世代の大きなスペースは、一般的に構成されており、より多くのライブオブジェクトは、ごみのリサイクル(フルガベージコレクション)の完全なラベル付けされた明確な、もっとひどいことになるの仕上げアクションを一時停止します。

生ごみリサイクルの完全な滞留時間を短縮するために開始するためのタグ最初の段階から、V8をもたらし、増分マーキング(インクリメンタルマーキング)にアクションを完了することになって息を一時停止し、多くの小さな「ステップ」に分割されていますそれぞれが「ステップ」は、JavaScriptアプリケーション・ロジックが交互に行わ少しマークフェーズが完了している間に、ガベージコレクションとアプリケーション・ロジックまで行ってみましょう終了しました。

顕著な改善インクリメンタルガーベジコレクションは、最大時間を一時停止した後にV8を約1/6、元のに減少させることができます。

GCログの表示

ビューログのガベージコレクションは、主にスタートアップ追加するための方法である--trace_gcパラメータを。

概要

  1. ノードV8、メモリ使用量や制御などのJavaScript実行エンジンは、V8によって制限されています。
  2. 旧世代のメモリと新しい世代へのV8は、オブジェクトが長い生存期間および短い生存期間または永久的なメモリを保存しました。
  3. 新世代のガベージコレクションアルゴリズムで使用するために捕捉する、利点は何のメモリの断片化をスピードアップしないで、欠点は、二倍のメモリ空間を占有しています。
  4. 古い世代の組み合わせで使用されるマークスイープとマークコンパクト2つのアルゴリズムでは、主にマークスイープを使用して、無移動物体の利点は、欠点は、メモリの断片です。マーク・コンパクトは、新しいオブジェクトが原因移動物体、遅くに、昇進、明確なメモリの断片化のために割り当てられた場合、メモリ空間をソートすることは不十分である、マーク・スイープに補完するものです。
  5. 完全な停止の影響をもたらすを減らすためにインクリメンタルマーキングV8を使用してください。

おすすめ

転載: www.cnblogs.com/chaohangz/p/10963565.html