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回中国クラウドコンピューティング標準およびアプリケーション会議

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

推薦する

ウェブマスターは検索プロトコルを理解し、robots.txtファイルに陥らないように注意する必要があります。

諺にもあるように、「技術を理解している人が SEO を理解しているとは限りませんし、SEO を理解し...

SEOについて簡単に説明:高品質な外部リンクは発信されない

コンテンツは王様であり、外部リンクも王様です。これは SEO 業界の古典的な格言であり、実際の応用に...

クラウドに移行する前に実行すべき 6 つのステップ

[[276793]] [51CTO.com クイック翻訳] あなたのビジネスはクラウドに移行する準備...

#6 月の特別オファー: WLS - $6/年/128M メモリ、$7/月/1G メモリ/Windows

weloveservers.net 6月のプロモーションが始まりました。 3種類あります: [1] ...

新しいサイトが含まれない要因と解決策

多くのウェブマスターは、この厄介な問題に遭遇します。なぜ私の新しいサイトはいつも含まれないのでしょう...

SNS運用におけるユーザー所有権の分析

みなさんこんにちは。今日はCool GrassrootsがSNSウェブサイトの運営におけるユーザー所...

オンライン広告大手の戦い

インターネットの最初の実際の収益モデルとして、オンライン広告はポータル、分類情報ウェブサイト、検索エ...

greengeeks-独立記念日/70% 割引コード/2.95 USD/無制限のウェブサイト構築/無料ドメイン名/SS サポート

カナダ建国 150 周年を記念して、greengeeks の無制限仮想ホスティングが 70% オフで...

大手企業がライブストリーミングを狙う:トラフィック獲得のためのゲーム!

ライブストリーミングは、結局のところトラフィックのゲームです。交通費補助金がなければ、羅永浩の2回目...

製造業におけるエッジコンピューティングの役割は何ですか?

[[355016]]コンピュータの誕生以来、私たちはスタンドアロンコンピュータ、PC&LAN...

単一ページを最適化するときにテンプレート テキストを削除する必要があるのはなぜですか?ユーザーと検索エンジンが答えを教えてくれる

2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っています最近、ウェ...

テンセントクラウド小威「AIアシスタント」は複数のアプリケーションを備え、業界のアップグレードのための新しいAIドライバーです

9月9日から11日まで、「未来経済、デジタルファースト」をテーマにしたテンセントグローバルデジタルエ...

ウェブマスターネットワークからの毎日のレポート:ソーシャルQ&Aウェブサイトが増加、Sina Weiboが正式にリストアップ

1. 垂直型電子商取引が「資本+利益」詐欺を打破するのは難しいのか?外部の力を借りて生き残ることがで...

いつでも、どこでも、何でもお望み通りに! IBM Cloud Paksは、企業のアプリケーション最新化の取り組みを支援します

[51CTO.com からのオリジナル記事] 今日、デジタル化は新たな常態となり、伝統的な経済からデ...

テンセントは情報通信技術アカデミーのOSCARでオープンソースのトップ事例の一つに選ばれ、そのオープンソースの実践が再び全国レベルで認められた。

10月16日、中国情報通信研究院が主催し、クラウドコンピューティング標準およびオープンソース推進委員...