JVM メモリ管理 - GC アルゴリズムの詳細な説明

JVM メモリ管理 - GC アルゴリズムの詳細な説明

導入

究極のアルゴリズムとは何ですか?

実際、これは現在の JVM で使用されているアルゴリズムであり、究極のものではありません。おそらく数年後には、新たな究極のアルゴリズムが登場するでしょう。私たちは達人の能力を信じているからこそ、それが実現することはほぼ間違いないでしょう。

では、世代別コレクション アルゴリズムは GC をどのように処理するのでしょうか?

[[285049]]

オブジェクト分類

世代別コレクション アルゴリズムは、オブジェクトのさまざまな特性に基づいて適切なアルゴリズムを使用します。ここでは実際には新しいアルゴリズムは作成されません。世代別コレクションアルゴリズムは 4 番目のアルゴリズムであると言うよりも、最初の 3 つのアルゴリズムの実用的な応用であると言った方が適切です。

まず、オブジェクトのさまざまな特性について説明し、次にこれらのオブジェクトの GC アルゴリズムを共同で選択していきます。

メモリ内のオブジェクトは、そのライフサイクルの長さに応じて、大まかに 3 つのタイプに分けられます。以下の名前はすべて個人名です。

1. 早死オブジェクト: 一夜にして生まれて死ぬオブジェクト。平たく言えば、それはすぐに死んでしまう物体です。

例: メソッドのローカル変数、ループ内の一時変数など。

2. 不滅のオブジェクト: このタイプのオブジェクトは通常、長期間存続し、非常に古い年齢になっても死にません。しかし、最終的な分析では、不滅の物体は遅かれ早かれほぼ確実に死にますが、それは「ほぼ」というだけです。

例: キャッシュ オブジェクト、データベース接続オブジェクト、シングルトン オブジェクト (シングルトン パターン) など。

3. 不滅のオブジェクト: このようなオブジェクトは、通常、一度誕生するとほぼ不滅です。彼らはほぼ常に不滅です。覚えておいてください、彼らはほぼ不滅です。

例: 文字列プール内のオブジェクト (flyweight パターン)、ロードされたクラス情報など。

オブジェクトに対応するメモリ領域

先ほどメモリ管理を紹介したとき、JVM がどのようにメモリを分割したかを覚えていますか?

上記の 3 種類のオブジェクトをメモリ領域にマップします。つまり、中止されたオブジェクトと不滅オブジェクトは JAVA ヒープに、不滅オブジェクトはメソッド領域にマップされます。

前の章で述べたように、JAVA ヒープの場合、JVM 仕様では GC の実装が必須です。したがって、未熟な物体や老化した物体の場合、死はほぼ避けられない結果ですが、それは「ほぼ」に過ぎません。一部のオブジェクトがアプリケーションの最後まで存続することは避けられません。ただし、JVM 仕様ではメソッド領域の GC は必須ではないため、JVM 実装でメソッド領域の GC が実装されていない場合、不滅オブジェクトは真に不滅オブジェクトとなります。

不滅オブジェクトのライフ サイクルは長すぎるため、世代別コレクション アルゴリズムは、JAVA ヒープ、つまり中止されたオブジェクトと古い不滅オブジェクト用に設計されています。

JAVA ヒープのオブジェクト回復 (中止されたオブジェクトと不滅のオブジェクト)

上記の分析に基づいて、世代別コレクション アルゴリズムが JAVA ヒープのメモリ回復、つまり中止されたオブジェクトと不滅オブジェクトの回復をどのように処理するかを見てみましょう。

中止されたオブジェクト: これらのオブジェクトは生成されてすぐに消滅し、寿命が短くなります。レプリケーション アルゴリズムを使用するための要件を覚えていますか?つまり、オブジェクトの生存率は高すぎることはできないため、中止されたオブジェクトはレプリケーション アルゴリズムの使用に最も適しています。

ちょっとした質問です: 50% のメモリの無駄をどうすればいいでしょうか?

Q&A: 中止されたオブジェクトの生存率は一般的に低いため、メモリの 50% をアイドル状態として使用する必要はありません。通常、2 つの 10% のメモリ領域はアイドル領域とアクティブ領域として使用され、メモリの残りの 80% は新しく作成されたオブジェクトのメモリを割り当てるために使用されます。 GC が発生すると、10% のアクティブ間隔と、残りの 80% 内の残存オブジェクトが 10% の空き間隔に転送されます。次に、前の 90% のメモリが解放され、これが繰り返されます。

GC プロセスをより明確に理解できるように、LZ は次の図を示します。

図は、各段階での 3 つの領域のメモリ状態を示しています。写真を見れば、GC プロセスを理解するのは難しくないと思います。

ただし、言及したい点が 2 つあります。 1 つ目は、この方法を使用するとメモリの 10% しか無駄にならないことです。メモリの整理と GC 速度が向上するため、これは許容範囲内です。 2 番目のポイントは、この戦略の前提は、生き残った各オブジェクトが占有するメモリがこの 10% のサイズを超えることができないということです。このサイズを超えると、余分なオブジェクトはコピーできなくなります。

上記の予期しない状況、つまり、生き残ったオブジェクトによって占有されるメモリが大きすぎる状況を解決するために、専門家は JAVA ヒープを 2 つの部分に分割します。上記の 3 つの領域は、新世代または若い世代と呼ばれる最初の部分です。残りの部分は、不滅のオブジェクトを格納するために使用され、古い世代と呼ばれます。

とても適切な名前ではないでしょうか?不滅の物体をどう扱うか見てみましょう。

不滅オブジェクト: このタイプのオブジェクトは、ほとんどが新しい世代から転送されるため、生存率が非常に高くなります。人間と同じように、長く生きれば不死になります。

通常、次の 2 つの状況が発生すると、オブジェクトは若い世代の領域から古い世代の領域に移動されます。

1. 新しい世代のすべてのオブジェクトには年齢があります。これらのオブジェクトの年齢が一定のレベルに達すると (年齢はオブジェクトが生き残った GC の数です。オブジェクトが各 GC を生き残ると、年齢は 1 ずつ増加します)、古い世代に転送されます。古い世代に転送するための age 値は、通常、JVM で設定できます。

2. 新しい世代で生き残ったオブジェクトが占有するメモリが 10% を超えると、余分なオブジェクトは古い世代に配置されます。このとき、古い世代は新しい世代のための「予備倉庫」となります。

不滅オブジェクトの特性を考慮すると、生存率が高すぎるため、レプリケーション アルゴリズムの使用は明らかに適切ではなくなり、古い世代がレプリケーション アルゴリズムを再度使用すると、バックアップ ウェアハウスがなくなることを忘れないでください。したがって、一般的に言えば、古い不滅オブジェクトには、マーク/スイープまたはマーク/スイープ アルゴリズムのみを使用できます。

メソッド領域でのオブジェクトのリサイクル(不滅オブジェクト)

上記の 2 つの状況では、GC の主な焦点が JAVA ヒープであり、世代別コレクション アルゴリズムのすべての内容も含まれているため、GC の問題の大部分は解決されています。不滅オブジェクトのその後のリサイクルは、世代別コレクション アルゴリズムの一部ではなくなります。

メソッド領域には不滅のオブジェクトが存在します。私たちがよく使うホットスポット仮想マシン(JDK のデフォルトの JVM)では、メソッド領域は親しみを込めて永続世代とも呼ばれます。とても適切な名前ではないでしょうか?

実のところ、はるか昔には、永続的な世代は存在しませんでした。当時は、JAVA クラスのインスタンス情報とクラス情報を含む永久世代と古い世代が一緒に保存されていました。しかし、後になってクラス情報のアンロードはほとんど行われないことがわかったので、2 つを分離しました。幸いなことに、これによりパフォーマンスはかなり向上しました。つまり、永久世代は分割されました。

このエリアのGCは旧世代と同様の方式を採用しています。 「予備の倉庫」がないため、どちらもマーク/スイープとマーク/コンパクトのアルゴリズムのみを使用できます。

リサイクルの時間

JVM が GC を実行する場合、上記の 3 つのメモリ領域が必ずしも一緒にリサイクルされるわけではありません。ほとんどの場合、新しい世代をリサイクルします。したがって、GC は回復される領域に応じて 2 つのタイプに分けられ、1 つは通常の GC (マイナー GC) であり、もう 1 つはグローバル GC (メジャー GC またはフル GC) です。対象地域は以下の通りです。

通常 GC (マイナー GC): 新しい世代領域のみの GC。

グローバル GC (メジャー GC またはフル GC): 古い世代の GC で、新しい世代の GC と永続的な世代の GC が伴う場合もあります。

古い世代と永続的な世代の GC 効果は比較的低く、2 つのメモリ使用量の増加は緩やかであるため、通常、グローバル GC をトリガーするには、通常の GC が数回必要になります。

<<:  特別レポート:2019年第9回中国クラウドコンピューティング標準およびアプリケーション会議

>>:  分散遅延メッセージングの実装方法を尋ねられたら、この記事を教えてあげてください。

推薦する

伝統的な企業はどのようにして価値の高いニュースマーケティングを行っているのでしょうか?

多数の伝統的な企業がインターネットに群がるにつれて、さまざまな業界での競争が特に激しくなり、無料トラ...

クラウドコンピューティング市場の競争が激化、IBMがフィンランドのクラウドコンピューティング企業Nordcloudを買収

IBMは12月25日、フィンランドのクラウドコンサルティングサービスプロバイダーNordcloudを...

入札プロモーションの必勝法:正確なキーワード

SEM とは何ですか? SEM は走査型電子顕微鏡の略語で、検索エンジン マーケティングを意味します...

2018年ガートナーAPMマジッククアドラントの有力者がTingyunのキラー機能に戻る:ビジネスとユーザーの理解

[51CTO.com からのオリジナル記事] ネットワーク システムのパフォーマンス管理から、さまざ...

クリックスルーは偽のSEOフレンドリー

月収10万元の起業の夢を実現するミニプログラム起業支援プラン高速ランキングは常にブラックハット SE...

ソーシャル ネットワーク マーケティング (I): ソーシャル ネットワーク マーケティングの本質

この記事は3つのパートに分かれています。第1部はソーシャルネットワークマーケティングの本質、第2部は...

クラウド コンピューティング インフラストラクチャを監視するための 7 つのステップ

デジタル化は新たな社会のホットスポットおよびトレンドになりつつあります。企業はデジタルトランスフォー...

ByteDance の「ドル箱」エンジン!

2019年に売上高1000億元以上の商業化目標を掲げているByteDanceは、2つの新たな「ドル箱...

終末の日11.11: タオバオストアのホリデープロモーションに関する興味深い話

伝説によると、今年は世界の終わりの年だそうです。今年の独身の日は11月11日です。おしゃべりはやめて...

リベートウェブサイト上の本物のリベートと偽物のリベートの主な違いは、それが請求されるかどうかです。

最近、「福建100%商城」、「温州百葉聯盟」、「太平洋直購」などの違法ねずみ講が「リベート」の名目で...

、知虎の最後の戦争

XXXについてどう思いますか?これはZhihu で質問をする一般的な方法です。このような難しい質問は...

ユーザーのニーズを満たす非オリジナルコンテンツを作成する方法

多くのウェブマスターは、ユーザーが必要とするコンテンツはウェブサイトのオリジナルコンテンツであると誤...

ライブストリーミングは本当にすべてを救えるのでしょうか?

ここ数年、O2O、シェアリング、ビッグデータ、AIなどの言葉が最新のビジネスモデルと生産性を代表し、...

クラウドプロバイダーがデジタル変革を推進する方法

クラウドプロバイダーがデジタル変革を推進する方法エッジ、5G、IoT、AI/機械学習、データと分析を...

将来、ウェブサイト間の究極の競争は、誰が最大のユーザーベースを持つかということになるでしょう。

ウェブサイトのキーワードランキングに影響を与える要因は多すぎます。ウェブサイトのキーワードランキング...