JVMメモリ管理-----GCアルゴリズムの徹底解説(究極のアルゴリズムを5分で教えます-----世代別コレクションアルゴリズム)

黄舟
リリース: 2016-12-28 15:48:45
オリジナル
1237 人が閲覧しました

はじめに

究極のアルゴリズムとは?
実際、これは現在の 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 は次の図を示します。

JVMメモリ管理-----GCアルゴリズムの徹底解説(究極のアルゴリズムを5分で教えます-----世代別コレクションアルゴリズム)


写真は、各段階での 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) にアクセスしてください。


関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!