JVMメモリ管理-----GCアルゴリズムの徹底解説(究極のアルゴリズムを5分で教えます-----世代別コレクションアルゴリズム)
はじめに
究極のアルゴリズムとは?
実際、これは現在の JVM で使用されているアルゴリズムであり、本当の究極ではありません。おそらく数年後には、新しい究極のアルゴリズムが登場するでしょう。そして、LZ は先進的な人々の能力を信じているので、ほぼ確実にそれが登場するでしょう。
それでは、世代別コレクション アルゴリズムは GC をどのように処理するのでしょうか?
オブジェクト分類
前の章で述べたように、世代別コレクション アルゴリズムはオブジェクトのさまざまな特性に基づいており、適切なアルゴリズムを使用することで、実際に新しいアルゴリズムが生成されることはありません。世代別コレクション アルゴリズムは 4 番目のアルゴリズムであると言うよりも、最初の 3 つのアルゴリズムの実用的なアプリケーションであると言った方が適切です。
まず、オブジェクトのさまざまな特性について説明します。次に、LZ がこれらのオブジェクトの GC アルゴリズムを選択します。
メモリ内のオブジェクトはライフサイクルの長さに応じて大きく3種類に分けられます。 以下の名前はすべてLZの個人名です。
1. 時期尚早のオブジェクト: 生まれては消えてしまうオブジェクト。平たく言えば、長く生きられる前に死んでしまうオブジェクトです。
例: 特定のメソッドのローカル変数、ループ内の一時変数など。
2. 不滅のオブジェクト: このタイプのオブジェクトは一般に長生きし、非常に高齢になっても生き続けますが、最終的には、不滅のオブジェクトは遅かれ早かれほぼ確実に死にます。
例: キャッシュ オブジェクト、データベース接続オブジェクト、シングルトン オブジェクト (シングルトン モード) など。
3. 不滅のオブジェクト: このようなオブジェクトは、一度誕生すると、ほぼ常に不滅であることを覚えておいてください。
例: String プール内のオブジェクト (フライウェイト モード)、ロードされたクラス情報など。
オブジェクトに対応するメモリ領域
以前にメモリ管理を紹介したときの、JVMによるメモリの分割をまだ覚えていますか?
上記の 3 つのオブジェクトをメモリ領域にマッピングします。つまり、premature オブジェクトと immortal オブジェクトは JAVA ヒープにあり、immortal オブジェクトはメソッド領域にあります。
前の章で、JAVA ヒープの場合、JVM 仕様では GC を実装する必要があると述べました。そのため、早期オブジェクトと不滅オブジェクトの場合、死はほぼ避けられない結果ですが、それは一部の場合にのみ発生します。オブジェクトはアプリケーションが終了するまで存続します。ただし、JVM 仕様ではメソッド領域での GC は要求されていないため、JVM 実装がメソッド領域で GC を実装しないと仮定すると、不滅オブジェクトは真に不滅オブジェクトになります。
不滅オブジェクトのライフサイクルは長すぎるため、世代別コレクション アルゴリズムは JAVA ヒープ、つまり未熟なオブジェクトと古い不滅オブジェクト用に設計されています。
JAVA ヒープ オブジェクトのリサイクル (若いオブジェクトと不滅のオブジェクト)
上記の分析を使用して、世代別コレクション アルゴリズムが JAVA ヒープのメモリのリサイクル、つまり時期尚早のオブジェクトと不滅のオブジェクトのリサイクルをどのように処理するかを見てみましょう。 。
期間オブジェクト: このタイプのオブジェクトは出現しては消滅し、存続期間が短くなります。レプリケーション アルゴリズムを使用するための要件をまだ覚えていますか?つまり、オブジェクトの生存率が高すぎることはできないため、レプリケーション アルゴリズムの使用には時期尚早のオブジェクトが最も適しています。
小さな質問: メモリの 50% が無駄になっている場合はどうすればよいですか?
回答: 時期尚早のオブジェクトの生存率は一般に低いため、メモリの 50% を空き領域として使用する必要はありません。通常、メモリの 2 つの 10% が空き領域およびアクティブ領域として使用され、残りの 80% が使用されます。メモリの一部は、新しく作成されたオブジェクトにメモリを割り当てるために使用されます。 GC が発生すると、アクティブな範囲の 10% と残りの 80% のオブジェクトが空き範囲の 10% に転送され、次に前のメモリの 90% がすべて解放されます。
この GC プロセスをより明確に確認できるように、LZ は次の図を示します。
写真は、各段階での 3 つの領域のそれぞれの記憶状態を示しています。写真を見れば、その GC プロセスを理解するのは難しくないと思います。
ただし、LZ について言及する必要がある点が 2 つあります。最初の点は、この方法を使用すると、メモリの適切な配置と GC 速度が得られるため、メモリの 10% しか無駄にならないということです。 2 番目の点は、この戦略の前提は、存続する各オブジェクトによって占有されるメモリがこの 10% のサイズを超えることができないということです。このサイズを超えると、余分なオブジェクトはコピーされなくなります。
上記の予期せぬ状況、つまり、生き残ったオブジェクトが占有するメモリが大きすぎる場合、を解決するために、専門家は JAVA ヒープを 2 つの部分に分割して対処します。上記の 3 つの領域は、新世代または新世代と呼ばれる最初の部分です。若い世代。残りの部分は、古くて不滅のオブジェクトの保存専用であり、旧世代と呼ばれます。
とてもふさわしい名前ではないでしょうか?古い不滅のオブジェクトに対処する方法を見てみましょう。
古い不滅のオブジェクト: ほとんどのオブジェクトは新しい世代から移されるため、このタイプのオブジェクトの生存率は非常に高くなります。人間と同じように、長く生きると老いて不死になります。
通常、以下の2つの状況が発生した場合、オブジェクトは新世代領域から旧領域に転送されます。
1. 新しい世代のすべてのオブジェクトには年齢が設定されます。これらのオブジェクトの年齢が特定のレベルに達すると、オブジェクトが各 GC で生き残った場合、年齢は 1 ずつ増加します。 )、その後、古い世代に転送されます。この古い世代への転送の経過時間の値は、通常、JVM で設定できます。
2. 新しい世代で生き残ったオブジェクトによって占有されるメモリが 10% を超えると、超過したオブジェクトは古い世代に配置されます。現時点では、旧世代は新世代の「バックアップ倉庫」となります。
不滅オブジェクトの特性に基づいて、生存率が高すぎるため、レプリケーション アルゴリズムの使用は明らかに適していません。また、古い世代がレプリケーション アルゴリズムを再度使用すると、バックアップが存在しないことを忘れないでください。倉庫。したがって、一般に、古い不滅オブジェクトに対して使用できるのは、マーク/整理アルゴリズムまたはマーク/クリア アルゴリズムのみです。
メソッド領域でのオブジェクトのリサイクル (不滅オブジェクト)
JAVA ヒープが GC の主な焦点であり、上記の 2 つの状況では、世代別のオブジェクトのすべての内容も含まれているため、GC の問題のほとんどが解決されました。コレクション アルゴリズム 、その後の不滅オブジェクトのリサイクルは、世代別コレクション アルゴリズムの一部ではなくなりました。
不滅オブジェクトはメソッド領域に存在します。私たちがよく使うホットスポット仮想マシン (JDK のデフォルト JVM) では、メソッド領域は親しみを込めて永続世代とも呼ばれます。
実際、ずっと前には永続世代は存在しませんでした。その際、JAVAクラスのインスタンス情報やクラス情報を含む永続世代と旧世代を一緒に保存していました。ただし、クラス情報のアンロードはめったに行われないことが後に判明したため、2 つは分離されました。幸いなことに、そうすることでパフォーマンスがかなり向上します。したがって、永続世代は分割されました。
この部分の GC は、旧世代と同様の方法を使用します。「バックアップ ウェアハウス」がないため、どちらもマーク/クリア アルゴリズムとマーク/整理アルゴリズムのみを使用できます。
リサイクルのタイミング
JVM が GC を実行するとき、上記の 3 つのメモリ領域は毎回一緒にリサイクルされるわけではなく、ほとんどの場合、リサイクルは新しい世代を指します。そのため、GCはリサイクル領域に応じて通常GC(マイナーGC)とグローバルGC(メジャーGCまたはフルGC)の2種類に分けられ、対象となる領域は以下の通りです。
通常GC(マイナーGC):新世代領域のみのGC。
グローバル GC (メジャー GC またはフル GC): 古い世代の GC、場合によっては新しい世代の GC および永続世代の GC を伴います。
古い世代と永続世代の GC 効果は比較的弱く、これら 2 つのメモリ使用量の増加が遅いため、通常、グローバル GC をトリガーするには通常の GC が数回必要です。
結論
上記は、JVMメモリ管理----GCアルゴリズムの改良(究極のアルゴリズムを教える5分---世代別コレクションアルゴリズム)の内容です。その他の関連コンテンツについては、ご注意ください。 PHP 中国語 Web サイト (www.php.cn) にアクセスしてください。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











この記事では、2025年の上位4つのJavaScriptフレームワーク(React、Angular、Vue、Svelte)を分析し、パフォーマンス、スケーラビリティ、将来の見通しを比較します。 強力なコミュニティと生態系のためにすべてが支配的なままですが、彼らの相対的なポップ

この記事では、リモートコードの実行を可能にする重大な欠陥であるSnakeyamlのCVE-2022-1471の脆弱性について説明します。 Snakeyaml 1.33以降のSpring Bootアプリケーションをアップグレードする方法は、このリスクを軽減する方法を詳述し、その依存関係のアップデートを強調しています

Javaのクラスロードには、ブートストラップ、拡張機能、およびアプリケーションクラスローダーを備えた階層システムを使用して、クラスの読み込み、リンク、および初期化が含まれます。親の委任モデルは、コアクラスが最初にロードされ、カスタムクラスのLOAに影響を与えることを保証します

この記事では、カフェインとグアバキャッシュを使用してJavaでマルチレベルキャッシュを実装してアプリケーションのパフォーマンスを向上させています。セットアップ、統合、パフォーマンスの利点をカバーし、構成と立ち退きポリシー管理Best Pra

node.js 20は、V8エンジンの改善、特により速いガベージコレクションとI/Oを介してパフォーマンスを大幅に向上させます。 新機能には、より良いWebセンブリのサポートと洗練されたデバッグツール、開発者の生産性とアプリケーション速度の向上が含まれます。

大規模な分析データセットのオープンテーブル形式であるIcebergは、データの湖のパフォーマンスとスケーラビリティを向上させます。 内部メタデータ管理を通じて、寄木細工/ORCの制限に対処し、効率的なスキーマの進化、タイムトラベル、同時wを可能にします

この記事では、キュウリの手順間でデータを共有する方法、シナリオコンテキスト、グローバル変数、引数の合格、およびデータ構造を比較する方法を調べます。 簡潔なコンテキストの使用、記述など、保守性のためのベストプラクティスを強調しています

この記事では、Lambda式、Streams API、メソッド参照、およびオプションを使用して、機能プログラミングをJavaに統合することを調べます。 それは、簡潔さと不変性を通じてコードの読みやすさと保守性の改善などの利点を強調しています
