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

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

推薦する

分散型高並列キャッシュ設計システム

概要キャッシュの概要キャッシュとはWiki でのキャッシュの定義: データへの後続のアクセスを高速化...

私たちがこの数年間に経験したマーケティング

「マーケティング」という言葉に馴染みのない人も多いかもしれませんが、ほとんどの人が経験したことがある...

百度の外部リンク反撃の真相と思惑

5月にウェブサイト間で最も話題になったのは、Baiduによるウェブサイトの外部リンクに対する反撃だろ...

ライブストリーミングについて知っておくべき37の統計

疫病によりライブストリーミングの輪は完全に崩壊し、ライブストリーミングは現在では主要アプリの基本機能...

アプリの海外プロモーションにはこれらのコツを知っておく必要があります

月収10万元の起業の夢を実現するミニプログラム起業支援プランインターネットの人口ボーナスが徐々に消滅...

在庫一掃: hosteons、月額 3.49 ドル、ロサンゼルス/ソルトレイクシティ、3G メモリ/3 コア/60g SSD/6T トラフィック/10Gbps 帯域幅/無料スナップショット

Hosteons は、ロサンゼルスとソルトレイクシティのデータセンターを対象とした在庫一掃プロモーシ...

簡単な分析:ウェブサイトが含まれない理由と解決策

1.ホームページが含まれていない(理由は3つあります) 1. 宇宙は不安定である2. 新しいサイト3...

SEOはユーザーエクスペリエンスを向上させる

かつて、SEO の世界でよく言われていた格言に、「コンテンツは王様、外部リンクは女王様」というものが...

クラウドへの移行による 5 つの主なメリット

クラウド コンピューティング テクノロジーを採用することで、企業はセキュリティ、シンプルさ、データ共...

「アップグレード」という名のもと、クラウドネイティブデータウェアハウスAnalyticDBのコア技術についてお話ししましょう

著者 |ヘンイ背景客室のアップグレードといえば、まず思い浮かぶのはエコノミークラスからビジネスクラス...

最適化のアイデアを決定し、最適化の効果を変換する

現在の検索エンジンの自然なランキング最適化はジレンマに陥っています。たとえば、Baidu は最近、「...

機密情報サイトでお金を稼ぐのは簡単ではない。革新的な収益モデルが鍵となる

機密情報ネットワークの運用環境は、最近かなり危険になっているようだ。過去数年間、58.com と G...

企業にはクラウドが必要ですか?クラウドテクノロジーのユースケースと利点

企業にはクラウドが必要ですか?約8〜10年前、この問題はさまざまな規模や業種の企業の経営者やオーナー...

コミュニティの再理解:希望はあるが、冬は長い

月収10万元の起業の夢を実現するミニプログラム起業支援プランコンテンツ分野は高収益のトラフィックプー...

新創クラウドの初年度に、EasyStackは新世代のフルスタック新創クラウドをリリースした。

新しいインフラの基礎として、情報技術応用イノベーション産業は発展の黄金期を迎えています。企業のデジタ...