検索
ホームページウェブフロントエンドjsチュートリアルJS のガベージ コレクション メカニズムの詳細な分析

JS のガベージ コレクション メカニズムの詳細な分析

Mar 02, 2023 pm 07:31 PM
javascriptガベージコレクションの仕組み

基本型はスタックに保存され、参照型はヒープに保存されます。 JavaScript は、変数 (オブジェクト、文字列など) が作成されるときに自動的にメモリを割り当て、使用されないときは「自動的に」解放します。解放するプロセスはガベージ コレクションと呼ばれます。

JS のガベージ コレクション メカニズムの詳細な分析

#ガベージ コレクション戦略

すべてのガベージ コレクターが実行する必要があるタスク

  • スペース内のアクティブ (ライブ) オブジェクトと非アクティブ (非ライブ) オブジェクトをマークする

  • 非アクティブなオブジェクトによって占有されているメモリをリサイクルまたは再利用します

  • メモリ断片化の発生を防ぐためのメモリ構成

ガベージ オブジェクトとは何ですか?

一般に、参照されていないオブジェクトはゴミであるため、削除する必要があります。ルートから開始してオブジェクトをトラバースします。

例外 複数のオブジェクト参照がリングを形成し、相互に参照しているにもかかわらず、ルートがそれらにアクセスできない場合、これらのオブジェクトもガベージであるため、クリアする必要があります。

ルート オブジェクトと存続オブジェクトとは

ルート オブジェクトには、本質的に到達可能なオブジェクトの基本セットがあります。

#グローバル変数ウィンドウ グローバル オブジェクト、DOM ドキュメント ツリー ルート オブジェクトなど
  • #…
  • # #values は明らかな理由により削除できません。 #ライブ オブジェクト

参照または参照チェーンがルートから他の値にアクセスできる場合、値はアクセス可能であるとみなされます

V8 エンジンのリサイクル世代別リサイクル方法ヒープを新しい世代と古い世代に分割します。 新世代は有効期間の短いオブジェクトを保存し、古い世代は有効期間が長いオブジェクトを保存します。


新世代のガベージ コレクター スカベンジ コピー アルゴリズムヒープ メモリ

を 2 つの部分に分割し、1 つは使用領域です。使用中のスペース、もう 1 つは空き領域、アイドル状態のスペースです。

    新しく追加されたオブジェクトは使用領域
  • に保存されます。使用領域がほぼいっぱいになったら、ゴミを取り除く必要があります。クリーンアップ操作。

    新世代のガベージ コレクターは、使用領域内の
  • アクティブ オブジェクト
  • オブジェクトをマークします。マークが完了すると、

    は使用領域内のアクティブ オブジェクトをコピーします。エリアからフリーエリアへ。メモリブロックが散在する問題を解決しました。 使用領域内の非アクティブなオブジェクトが占めていたスペースをクリーンアップします。最後に、役割が逆転し、元の使用領域が新たな空き領域となり、元の空き領域が新たな使用領域となる。

  • #オブジェクトは古い世代に移動されました

オブジェクトが何度もコピーされてもまだ残っている場合、そのオブジェクトは存在するとみなされます。ライフサイクルが長いため、長いオブジェクトはその後古い世代に移動されます。 オブジェクトを空き領域にコピーし、空き領域の 25% 以上を占有している場合、オブジェクトは古い世代のスペースに直接昇格されます。その理由は、元の空き領域が新たな使用領域となり、オブジェクトのメモリ割り当てが継続され、比率が高すぎると、新しいオブジェクトに使用できる領域が不足するためです。

  • #新世代の最適化並列リサイクル

完全一時停止問題 JavaScript はシングルスレッドですメイン スレッドで実行すると、JavaScript スクリプトの実行はガベージ コレクション中にブロックされます。スクリプトの実行を再開する前に、ガベージ コレクションが完了するまで待つ必要があります。

GC に時間がかかりすぎると、ページがフリーズする可能性があります。

並列リサイクル メカニズム

メイン スレッドでのガベージ コレクターの実行中に、複数の補助スレッドが開始され、同じリサイクル作業を同時に実行します。


#旧世代のガベージ コレクション

JS のガベージ コレクション メカニズムの詳細な分析

スカベンジ メソッドの使用に関する問題

1. 生存オブジェクト数が多すぎると、生き残ったオブジェクトを頻繁にコピーする効率が低下します 2. スペースの半分が無駄になります は主に マーククリア

メソッドを使用します。割り当てが不十分です。

mark-organize を使用してください。
メソッド

旧世代のガベージ コレクション期間で使用されるアルゴリズム

1. まず、mark-clear を使用してガベージ スペースの回復を完了します。 2. スペースの最適化にはマーク整理を使用します; 3. 効率の最適化には最適化増分マーキングと遅延クリーニングを使用します;


##マークのクリアとマーキング構成アルゴリズム

scavenge は生きているオブジェクトのみをコピーしますが、mark-clear は死んだオブジェクトのみを消去します。

生きている物体は新しい世代のほんの一部に過ぎず、死んだ物体は古い世代のほんの一部に過ぎないため、どちらのリサイクル方法も効率的に処理できます欠点

記憶の断片が多すぎます。大きなメモリを割り当てる必要がある場合、残りの断片化された領域では割り当てを完了するのに十分ではないため、ガベージ コレクションが事前にトリガーされ、このコレクションは不要です。

-> マーキング整理アルゴリズム 生き残ったオブジェクトをマーキングした後、生き残ったオブジェクトをメモリ空間の一端に移動し、移動が完了したら、境界の外側にあるすべてのメモリをクリアします

最適化 - 増分マーキングと遅延クリーンアップ

増分マーキング

オブジェクトが多く、セット全体を走査してマークしようとする場合複数のオブジェクトを同時に実行すると、時間がかかり、実行に多少の遅れが生じる場合があります。したがって、エンジンはガベージ コレクションを複数の部分に分割しようとします。その後、各部分が個別に実行されます。

V8 は、 旧世代のガベージ コレクターを最適化し、完全な一時停止マーキングから増分マーキング に切り替えました。
ガベージ コレクションを短期間の GC ガベージ コレクションに変える
JS のガベージ コレクション メカニズムの詳細な分析
黒と白 (生存と死亡) のマーキング戦略が採用されている場合、ガベージ コレクターはリサイクル後にインクリメントを実行します。アプリケーションで JavaScript コードを実行するために一時停止した後、メイン スレッドが有効になります。その後、ガベージ コレクターが再び開始されると、メモリ内には白黒が残り、次にどこに進むべきかわかりません。

遅延クリーンアップ

遅延クリーンアップは、増分マーキングが完了した後に開始されます。インクリメンタル マーキングが完了したときに、現在使用可能なメモリがコードをすぐに実行するのに十分な場合は、実際にはすぐにメモリをクリーンアップする必要はありません。クリーンアップ プロセスを少し遅らせて、JavaScript スクリプト コードを最初に実行することができます。一度にすべてをクリーンアップする必要はありません。非アクティブなオブジェクト メモリがすべてクリアされた後、すべての非アクティブなオブジェクト メモリがクリアされるまで、必要に応じて 1 つずつクリーンアップしてから、増分マーキングを実行できます

3 色マーキング方式の一時停止と再開

3 色マーキング方式のマーク操作は、毎回メモリ空間全体をスキャンすることなく、段階的に実行できます。一時停止と回復のための増分リサイクルと適切に調整できるため、合計一時停止時間が短縮されます。

  • 白: マークされていないオブジェクト
  • 灰色: オブジェクト自体がマークされています。およびオブジェクトの参照オブジェクトはマークされていません
  • 黒: それ自体とオブジェクトの参照オブジェクト (矢印が指すオブジェクト) の両方がマークされます

JS のガベージ コレクション メカニズムの詳細な分析
ルート オブジェクトのグループから開始し、 最初にルート オブジェクトが灰色にマークされ、マーキング ワークシートにプッシュされます。リサイクル業者がマーキング ワークシートからオブジェクトをポップし、その参照オブジェクトにアクセスすると、自身が灰色から黒に変換されます。灰色

灰色のマークが付けられるオブジェクトがなくなるまで、つまり到達できるオブジェクトがなくなるまで下に進み続け、その後、残りの白いオブジェクトがすべて変換されます。到達不能、つまりリサイクルを待っています。

現在のメモリに灰色のノードがあるかどうかで、マーク全体が完了したかどうかが決まります。灰色のノードがない場合は、直接クリーンアップ フェーズに入ります。灰色のマークがまだある場合は、 、リカバリ中に灰色のノードから直接実行を続行します。 、タスクプログラムが実行され、オブジェクトの参照関係が変更されます。

最初の増分セグメンテーションでは、すべての ABC が黒でマークされ、次に JavaScript スクリプトが実行され (B->D)、2 番目の増分セグメンテーションが開始されるとします。 新しいオブジェクト D は最初は白ですが、現時点では灰色のオブジェクトはありません。これは、すべてのマーキングが完了し、クリーンアップを開始する必要があることを意味します。D はクリーンアップ フェーズでリサイクルされます。これは正しくない。 V8 では書き込みバリア メカニズムが導入されており、黒いオブジェクトが白いオブジェクトを参照すると、このメカニズムにより参照された白いオブジェクトが灰色に変わります。


JS のガベージ コレクション メカニズムの詳細な分析#同時リサイクル


並行リサイクルはメイン スレッドをブロックします増分マークにより、合計一時停止時間が増加します。 、アプリケーションのスループットを低下させる

#メイン スレッドが JavaScript を実行している間、補助スレッドはバックグラウンドでガベージ コレクション操作を完了できます#[推奨学習: JavaScript 上級チュートリアル ##]

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

声明
この記事はcsdnで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。
Python vs. JavaScript:コミュニティ、ライブラリ、リソースPython vs. JavaScript:コミュニティ、ライブラリ、リソースApr 15, 2025 am 12:16 AM

PythonとJavaScriptには、コミュニティ、ライブラリ、リソースの観点から、独自の利点と短所があります。 1)Pythonコミュニティはフレンドリーで初心者に適していますが、フロントエンドの開発リソースはJavaScriptほど豊富ではありません。 2)Pythonはデータサイエンスおよび機械学習ライブラリで強力ですが、JavaScriptはフロントエンド開発ライブラリとフレームワークで優れています。 3)どちらも豊富な学習リソースを持っていますが、Pythonは公式文書から始めるのに適していますが、JavaScriptはMDNWebDocsにより優れています。選択は、プロジェクトのニーズと個人的な関心に基づいている必要があります。

C/CからJavaScriptへ:すべてがどのように機能するかC/CからJavaScriptへ:すべてがどのように機能するかApr 14, 2025 am 12:05 AM

C/CからJavaScriptへのシフトには、動的なタイピング、ゴミ収集、非同期プログラミングへの適応が必要です。 1)C/Cは、手動メモリ管理を必要とする静的に型付けられた言語であり、JavaScriptは動的に型付けされ、ごみ収集が自動的に処理されます。 2)C/Cはマシンコードにコンパイルする必要がありますが、JavaScriptは解釈言語です。 3)JavaScriptは、閉鎖、プロトタイプチェーン、約束などの概念を導入します。これにより、柔軟性と非同期プログラミング機能が向上します。

JavaScriptエンジン:実装の比較JavaScriptエンジン:実装の比較Apr 13, 2025 am 12:05 AM

さまざまなJavaScriptエンジンは、各エンジンの実装原則と最適化戦略が異なるため、JavaScriptコードを解析および実行するときに異なる効果をもたらします。 1。語彙分析:ソースコードを語彙ユニットに変換します。 2。文法分析:抽象的な構文ツリーを生成します。 3。最適化とコンパイル:JITコンパイラを介してマシンコードを生成します。 4。実行:マシンコードを実行します。 V8エンジンはインスタントコンピレーションと非表示クラスを通じて最適化され、Spidermonkeyはタイプ推論システムを使用して、同じコードで異なるパフォーマンスパフォーマンスをもたらします。

ブラウザを超えて:現実世界のJavaScriptブラウザを超えて:現実世界のJavaScriptApr 12, 2025 am 12:06 AM

現実世界におけるJavaScriptのアプリケーションには、サーバー側のプログラミング、モバイルアプリケーション開発、モノのインターネット制御が含まれます。 2。モバイルアプリケーションの開発は、ReactNativeを通じて実行され、クロスプラットフォームの展開をサポートします。 3.ハードウェアの相互作用に適したJohnny-Fiveライブラリを介したIoTデバイス制御に使用されます。

next.jsを使用してマルチテナントSaaSアプリケーションを構築する(バックエンド統合)next.jsを使用してマルチテナントSaaSアプリケーションを構築する(バックエンド統合)Apr 11, 2025 am 08:23 AM

私はあなたの日常的な技術ツールを使用して機能的なマルチテナントSaaSアプリケーション(EDTECHアプリ)を作成しましたが、あなたは同じことをすることができます。 まず、マルチテナントSaaSアプリケーションとは何ですか? マルチテナントSaaSアプリケーションを使用すると、Singの複数の顧客にサービスを提供できます

next.jsを使用してマルチテナントSaaSアプリケーションを構築する方法(フロントエンド統合)next.jsを使用してマルチテナントSaaSアプリケーションを構築する方法(フロントエンド統合)Apr 11, 2025 am 08:22 AM

この記事では、許可によって保護されたバックエンドとのフロントエンド統合を示し、next.jsを使用して機能的なedtech SaaSアプリケーションを構築します。 FrontEndはユーザーのアクセス許可を取得してUIの可視性を制御し、APIリクエストがロールベースに付着することを保証します

JavaScript:Web言語の汎用性の調査JavaScript:Web言語の汎用性の調査Apr 11, 2025 am 12:01 AM

JavaScriptは、現代のWeb開発のコア言語であり、その多様性と柔軟性に広く使用されています。 1)フロントエンド開発:DOM操作と最新のフレームワーク(React、Vue.JS、Angularなど)を通じて、動的なWebページとシングルページアプリケーションを構築します。 2)サーバー側の開発:node.jsは、非ブロッキングI/Oモデルを使用して、高い並行性とリアルタイムアプリケーションを処理します。 3)モバイルおよびデスクトップアプリケーション開発:クロスプラットフォーム開発は、反応および電子を通じて実現され、開発効率を向上させます。

JavaScriptの進化:現在の傾向と将来の見通しJavaScriptの進化:現在の傾向と将来の見通しApr 10, 2025 am 09:33 AM

JavaScriptの最新トレンドには、TypeScriptの台頭、最新のフレームワークとライブラリの人気、WebAssemblyの適用が含まれます。将来の見通しは、より強力なタイプシステム、サーバー側のJavaScriptの開発、人工知能と機械学習の拡大、およびIoTおよびEDGEコンピューティングの可能性をカバーしています。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター

WebStorm Mac版

WebStorm Mac版

便利なJavaScript開発ツール