JavaScriptのガベージコレクションで

より多くのリソースのためのgithubの

https://github.com/ChenMingK/WebKnowledges-Notes
オンライン読書:https://www.kancloud.cn/chenmk/web-knowledges/1080520

ガーベジコレクション

ガベージコレクションのアルゴリズムについては、核となるアイデアは、メモリはもはや使用されない方法を決定することである
比較的古いことわざがある参照カウントマークをクリア

参照カウント

参照カウントアルゴリズムが定義され、「未使用のメモリを、」標準は非常に簡単であり、オブジェクトはそれへの参照を持っているかどうかを確認することです。他のオブジェクトがそれに存在しない場合は、オブジェクトはもはや必要であることを示していません。

// 创建一个对象 person,他有两个指向属性 age 和 name 的引用
var person = {
    age: 12,
    name: 'aaaa'
};
 
person.name = null // 虽然设置为null,但因为 person 对象还有指向 name 的引用,因此name 不会回收
 
var p = person
person = 1        // 原来的 person 对象被赋值为 1,但因为有新引用 p 指向原 person 对象,因此它不会被回收
p = null           // 原 person 对象已经没有引用,很快会被回收

上記から分かるように、参照カウントアルゴリズムは、シンプルで効果的な方法です。循環参照:しかし、それは致命的な問題があります。2つのオブジェクトが、彼らが使用されなくなっていても、お互いを参照してくださいしない場合は、ガベージコレクタは、メモリリークにつながる、回復されることはありません。以下の例

function cycle () {
    var o1 = {}
    var o2 = {}
    o1.a = o2
    o2.a = o1
    return "Cycle reference!"
}
cycle()

クリアラベル

クリアラベリングアルゴリズム「を使用しなくなったオブジェクトは」と定義され、「ターゲットを達成することができません。」単にルートからメモリに、オブジェクトの走査開始タイミングを置く(オブジェクトは、JSにグローバルです)。人々は、彼らが使用されることもあり、根から到着するかもしれません。これらのオブジェクトの根から始まっ触れることはできませんが、使用にはもはやとしてマークされていない、後に回収しました。
この概念からわかるように、我々は、オブジェクトが、オブジェクトの概念への参照が含まれていない触れることができない(ない任意のオブジェクト参照のオブジェクトにはアクセスできません)。しかし、逆は必ずしも真ではありません。

V8エンジンのガーベジコレクション

あなたは読むことができる記事を最近いくつかのV8のガベージコレクションを紹介する「素人の言語のNode.js」アモイを読み、。

V8のガベージコレクションとメモリの制限

一般的なバックエンドの開発言語では、メモリ使用量には根本的な制限がないが、ノードに見出される(64ビットシステムは、JavaScriptを使用することにより約32ビットシステムメモリの約1.4 GBの記憶部を使用することができ0.7ギガバイト)。そのような制限の下では、操作は直接的な2GBのファイルとして、大容量メモリ、Nodeオブジェクトにはなりません文字列解析処理用メモリに読み込むことができません。(ストリームモジュールは、この問題を解決します)

この問題の主な原因は、ノードベースのビルドV8は、V8は、ブラウザ・アプリケーション・シナリオで十分なメモリ管理メカニズム以上であるということですが、ノードで、開発者が限定されています。だから我々はV8のメモリ管理スキームを知っておく必要があります。

オブジェクト割り当てV8

V8では、すべてのJavaScriptオブジェクト(物体)がヒープを介して割り当てが行われる次のように、ノードは、ビューのメモリ使用量のV8を提供します。

process.memoryUsage()
{ rss: 21434368,
  heapTotal: 7159808,
  heapUsed: 4455120,
  external: 8224 }

これは、heapTotalとheapUsedは、V8ヒープのメモリ使用量で、前者は、現在使用中の量であるヒープメモリに適用しています。あなたは、空きメモリヒープ新しいオブジェクトの割り当てに適用している場合ではありませんV8ヒープサイズが制限値に達する超えるまでは十分なヒープメモリが引き続き適用されます。
V8は、ヒープのサイズを制限する理由として、メモリは主総会を超えるガベージコレクションによって引き起こされるJavaScriptの時間が長くなるの実行を中断するためのスレッドを起こし、アプリケーションのパフォーマンスと応答性がまっすぐ下落となり、このような状況は容認できないバックエンドサービス、フロントエンド・ブラウザだけではありません我々は受け入れることができません。そのため、時間制限ダイレクトヒープメモリを考慮して良い選択です。
しかし、V8はまた、あなたが起動したときにノードには、以下のオプションを渡すことができ、私たちはこの制限を開いてみましょうするためのオプションを提供しています:

node --max-old-space-size=1700 test.js // 单位为 MB 设置老生代的内存空间
node --max-new-space-size=1024 test.js // 单位为 KB 设置新生代的内存空间

V8は、一度力に変更することができないときの初期化パラメータの上に有効になります。

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

V8のガーベッジ・コレクション・ポリシーは、主に実用的なアプリケーションでは、世代別ガベージコレクションのメカニズムに基づいており、それがすべてのシナリオの可能ガベージコレクションアルゴリズムのどれもが、長さの異なるオブジェクトのライフサイクルので、異なるアルゴリズムは、特定の状況になることはできませんことが判明しましたこれは、最良の効果を持っています。したがって、現代のガベージコレクションアルゴリズム異なる世代メモリのガベージコレクションの生存期間のオブジェクトに応じて、その後、異なる世代のメモリのためのより効率的なアルゴリズムに供しました。
V8、新世代へのメインメモリと旧世代で。オブジェクトの短い生存期間の新世代のためのターゲットは、旧世代のためのオブジェクトは、長く生存またはオブジェクトの永続メモリ。

ここに画像を挿入説明

アルゴリズムを捕捉
世代基準で、新世代のガベージコレクションは、主に特定の実装での清掃アルゴリズム、清掃をすることにより行われる、mainメソッドは、チェイニーを用います。
チェイニーガベージコレクションアルゴリズムが使用されるアルゴリズム複製方法二つにそれヒープメモリであり、空間の各部分はsemispace呼ばれます。これら二つのsemispace空間では、一つだけは他のアイドルで、使用されています。スペースの使用中のスペースは、宇宙からのsemispaceと呼ばれ、アイドルスペースがために呼び出されます。

ここに画像を挿入説明
私たちはより最初に、オブジェクトを割り当てるとスペースを割り当てます。ガベージコレクションを開始すると、オブジェクトによって占有生存空間がリリースされるのではなく、宇宙からのライブオブジェクトは、これらのオブジェクトの生存期間が空間ににコピーされます確認します。
スペースから、コピーした後、および発生した空間を交換する役割。

  • 欠点は唯一のヒープメモリの半分を使用することであるスカベンジ
  • スカベンジは、新世代のための適切な時間アルゴリズムの典型的な犠牲スペースであるため、オブジェクトの新しい世代の短いライフサイクル
  • オブジェクトがコピーされると、多くの時間がまだ生きている、それは古い世代に移動される、オブジェクトの長いライフサイクルと見なされます、このプロセスが呼び出されるプロモーション

マーク・スイープ&マーク・コンパクト
古い世代のオブジェクト、大きなライブオブジェクトの割合は、旧世代の主V8の実施形態、およびガベージコレクションのマーク・スイープのMark-コンパクト組み合わせの長いライフサイクル
マークスイープ:クリアマーク、マークと2つの段階にそれを掃きます。すべてのヒープトラバーサルマークフェーズにおけるオブジェクトと生きているオブジェクトをマークは、唯一のオブジェクトがクリーンアップフェーズでマークされていないクリア。マーク・スイープ最大の問題は、一度、早期トリガーガベージコレクションのラージオブジェクトのリードを割り当てるように十分なスペースデブリとして不連続な状態、メモリの断片化が原因となっている、後続のメモリ割り当ての問題になりますメモリ空間の明確な回復をマークしていることです。
そして、マーク・コンパクトがあります:タグが外部の国境の完了後にメモリから直接クリーンアップを仕上げ、動き(合併)の最後に完了プラス仕上げ段階、ライブオブジェクトをマークした後、要するに、整理します。

ここに画像を挿入説明
マーキングインクリメンタル
三つの基本的なガベージコレクションのアルゴリズムの出現を参照一貫性のないアプリケーションロジックとJavaScriptガベージコレクタを避けるためには、アプリケーションロジックを実行し、一時停止するガベージコレクションの回復の実装前に完了するためのロジックを適用する必要があり、この動作が呼び出されますフルストップ(ストップ世界を)。
新世代のために、完全な停止はほとんど効果がありますが、古い世代のために改善する必要があります。
もたらすごみリサイクルの完全な滞留時間を短縮するために、V8は、それぞれが「行って、おそらく多くの小さい「ステップ」のアクションを完了するために、オリジナルの息のポーズを分割するために、技術増分マーキング(マーキング増分)を使用していますステッパー「JavaScriptアプリケーション・ロジックは、マークフェーズが完了するまで交互に行わ少しの間、ガベージコレクションとアプリケーションロジックを実行してみましょう。

ここに画像を挿入説明
V8以降のクリーンアップも遅延(スイープ怠け者)、インクリメンタル照合(インクリメンタルコンパクション)、紹介同時マーク技術、興味自分自身についてかもしれないが。

ビューガベージコレクションのログ

スタートアップ追加--trace_gcガベージコレクションを行う際に、ガベージコレクションが標準出力からログ情報を印刷するように、パラメータを。
ここではサンプルは、実行後、ガベージコレクタは、すべての情報gc.logファイルを取得します、です。

node --trace_gc -e "var a = []; for (var i = 0; i < 1000000; i++) a.push(new Array(100));" > gc.log

起動時にノードパラメータ--prof使用することにより、データ・プロファイリングは、V8で行うことができます。

node --prof test.js

おすすめ

転載: www.cnblogs.com/cmk1018/p/11347571.html