導入 究極のアルゴリズムとは何ですか? 実際、これは現在の JVM で使用されているアルゴリズムであり、究極のものではありません。おそらく数年後には、新たな究極のアルゴリズムが登場するでしょう。私たちは達人の能力を信じているからこそ、それが実現することはほぼ間違いないでしょう。 では、世代別コレクション アルゴリズムは GC をどのように処理するのでしょうか?
オブジェクト分類 世代別コレクション アルゴリズムは、オブジェクトのさまざまな特性に基づいて適切なアルゴリズムを使用します。ここでは、実際に新しいアルゴリズムは作成されません。世代別コレクションアルゴリズムは 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 ずつ増加します)、古い世代に転送されます。古い世代に転送するための年齢値は、通常、JVM で設定できます。 2. 新しい世代で生き残ったオブジェクトが占有するメモリが 10% を超えると、余分なオブジェクトは古い世代に配置されます。このとき、古い世代は新しい世代のための「予備倉庫」となります。 不滅オブジェクトの特性を考慮すると、生存率が高すぎるため、レプリケーション アルゴリズムの使用は明らかに適切ではなくなり、古い世代がレプリケーション アルゴリズムを再度使用すると、バックアップ ウェアハウスがなくなることを忘れないでください。したがって、一般的に言えば、古い不滅オブジェクトには、マーク/スイープまたはマーク/スイープ アルゴリズムのみを使用できます。 メソッド領域でのオブジェクトのリサイクル(不滅オブジェクト) 上記の 2 つの状況では、GC の問題の大部分が解決されています。これは、JAVA ヒープが GC の主な焦点であり、上記には世代別コレクション アルゴリズムのすべての内容も含まれているためです。その後の不滅オブジェクトのリサイクルは、もはや世代別コレクション アルゴリズムの一部ではありません。 メソッド領域には不滅オブジェクトが存在します。私たちがよく使うホットスポット仮想マシン(JDK デフォルトの JVM)では、メソッド領域は親しみを込めて永久世代とも呼ばれています。とても適切な名前ではないでしょうか。 実のところ、はるか昔には、永続的な世代は存在しませんでした。当時は、JAVA クラスのインスタンス情報とクラス情報を含む永久世代と古い世代が一緒に保存されていました。しかし、後になってクラス情報のアンロードはほとんど行われないことがわかったので、2 つを分離しました。幸いなことに、これによりパフォーマンスはかなり向上しました。つまり、永久世代は分割されました。 この領域の GC は、旧世代と同様の方式を採用しています。「予備倉庫」がないため、どちらもマーク/スイープとマーク/コンパクトのアルゴリズムしか使用できません。 リサイクルの時間 JVM が GC を実行するとき、上記の 3 つのメモリ領域を常に一緒にリサイクルするわけではありません。ほとんどの場合、新しい世代をリサイクルします。そのため、GC は回復する領域に応じて 2 種類に分けられ、1 つは通常の GC (マイナー GC)、もう 1 つはグローバル GC (メジャー GC または Full GC) です。対象となる領域は次のとおりです。 通常 GC (マイナー GC): 新しい世代領域のみの GC。 グローバル GC (メジャー GC またはフル GC): 古い世代の GC で、新しい世代の GC と永続世代の GC が伴う場合もあります。 古い世代と永続的な世代の GC 効果は比較的低く、2 つのメモリ使用量の増加は緩やかであるため、通常、グローバル GC をトリガーするには、通常の GC が数回必要になります。 |
<<: Hubo Technologyが「2019年グローバルフィンテックイノベーションTOP50」に選出されました
>>: 強力な人工知能を制御できる者は、世界全体を制御することになるのでしょうか?
何十年もの間、セキュリティは重要であると考えられてきましたが、いわゆる「コアビジネス」機能に関与した...
[[320195]]ビッグデータにより自動運転の未来が可能になります。自動運転は自動車メーカーの間で...
最近、OpenAI の主任科学者 Ilya Sutskever 氏が、計算理論の研究に重点を置く S...
[[327668]]コンピュータービジョンを研究している大学院生 985 人が卒業後に就職できない...
AIの拡大する影響私たちの日常生活における AI の影響はますます明らかになってきています。 AI ...
IT Homeは2月21日、マイクロソフトが本日Windows 11 Build 26058プレビ...
序文GitHub Hot Trends Vol.046では、HGがMicrosoftのオープンソース...
ソフトウェア開発者は、コードの作成とレビュー、バグの検出、ソフトウェアのテスト、開発プロジェクトの最...
ディープラーニングと 3D テクノロジーの発展により、Neural Radiance Fields ...
人工知能 (AI) は今日の産業情勢を変えています。 エンタープライズ ソフトウェアから機械の自動化...