#このチュートリアルの動作環境: Windows7 システム、Java8 バージョン、DELL G3 コンピューター。jvm のガベージ コレクション メカニズムは GC (ガベージ コレクション) であり、ガベージ コレクターとも呼ばれます。 GC の基本原理: メモリ内で使用されなくなったオブジェクトをリサイクルします。GC でリサイクルする方法はコレクターと呼ばれます。GC はある程度のリソースと時間を消費する必要があるため、Java はオブジェクトのライフサイクル特性を分析し、オブジェクトに従います。アプリケーションへの GC による一時停止をできるだけ短くするために、新世代と旧世代で収集されます。
ガベージ コレクションが必要な理由
#● 新世代へのコレクションオブジェクトのコレクションはマイナー GC
と呼ばれます。 ● 古い世代のオブジェクトのコレクションはフル GC と呼ばれます。 ● プログラム内で System.gc() を積極的に呼び出すことによって強制される GC はフル GC
です。オブジェクト参照タイプ、GC はリサイクルにさまざまな方法を使用します。JVM オブジェクト参照は 4 つのタイプに分類されます:
● ソフト参照: ソフト参照は、キャッシュ シナリオに適した Java で提供されるアプリケーションです (メモリが十分でない場合にのみ GC が行われます)
● 弱い参照: 確実にGC 中に GC によってリサイクルされる
● 仮想参照: 仮想参照は、オブジェクトが GC されたかどうかを知るためにのみ使用されるため、
仮想マシン スタック、
ローカル メソッド スタック,
ヒープ領域 、
メソッド領域 。このうち、プログラムカウンタ、仮想マシンスタック、ローカルメソッドスタックの3領域はスレッドによって生成・破棄される領域であるため、これらの領域のメモリ割り当てとリサイクルは決定的であり、リサイクル問題を考慮する必要はありません。メソッドが終了するかスレッドが終了すると、メモリは自然にリサイクルされるため、あまりにも多すぎます。 Java ヒープ領域とメソッド領域は異なり、メモリのこの部分の割り当てとリサイクルは動的であるため、ガベージ コレクターはこれに注目する必要があります。
利点: 参照カウント コレクターは迅速に実行でき、プログラムの実行と連動します。プログラムを長時間中断する必要がないリアルタイム環境では、より有益です。
欠点: 循環参照を検出できません。親オブジェクトが子オブジェクトへの参照を持っている場合、子オブジェクトは親オブジェクトを参照します。このようにすると、参照カウントが 0 になることはありません。
# 参照カウントを通じて上記のコードを分析します。
● 仮想マシン スタック (スタック フレーム内のローカル変数テーブル) で参照されるオブジェクト;
●メソッド領域 クラスの静的プロパティによって参照されるオブジェクト;
● メソッド領域の定数によって参照されるオブジェクト;
● ローカル メソッド スタック内の JNI (ネイティブ メソッド) によって参照されるオブジェクト。
マーキング ステージ: マーキング プロセスは、実際には、前に紹介した到達可能性分析アルゴリズムのプロセスであり、すべての GC Roots オブジェクトを横断し、各 GCRoots からオブジェクトに到達できるようにします。オブジェクトは、通常はオブジェクトのヘッダーに識別子でマークされ、到達可能なオブジェクトとして記録されます。
クリアリングフェーズ: クリーニングプロセスはヒープメモリを走査することで、オブジェクトが到達可能なオブジェクトとしてマークされていないことが判明した場合、(オブジェクトを読み取ることによって)ヘッダー情報)があれば再利用されます。
ガベージ コレクターが GC を実行するときは、すべての Java 実行スレッドを停止する必要があります (「ストップ ザ ワールド」とも呼ばれます)。これは、マーキング フェーズ中に到達可能性解析が実行されると、その間にオブジェクト参照関係を維持できないためです。解析処理の条件を変更した場合、リーチャビリティ解析結果の精度は保証できません。アプリケーション スレッドは、マークがクリアされるまで実行を再開しません。
マーク/クリア アルゴリズムの欠点: ●
効率の問題 マーキングとクリアの 2 つのフェーズの効率両方のステージでメモリ内のオブジェクトを走査する必要があり、多くの場合、メモリ内のオブジェクト インスタンスの数が非常に多くなり、間違いなく非常に時間がかかり、GC 中にアプリケーションを停止する必要があるため、クリアはそれほど高くありません。これはユーザー エクスペリエンスを非常に低下させることになります。
●
スペースの問題 マークをクリアすると、不連続なメモリの断片が大量に生成されます (上図からわかるように)。より大きなオブジェクトを割り当てる場合、不十分な連続メモリが見つからないため、別のガベージ コレクション アクションを早めにトリガーする必要があります。
コピー アルゴリズムは毎回半分のエリア全体のメモリをリサイクルするため、マークされたオブジェクトをトラバースする時間が短縮されます。使用済みエリア オブジェクトをクリアする場合、トラバースする必要はなく、エリア全体のメモリが直接クリアされます。残ったオブジェクトがコピーされます 予約領域もアドレス順に格納されるため、メモリの断片化の問題が解決されます オブジェクトのメモリを割り当てる際、メモリの断片化などの複雑な問題を考慮する必要はありません 順番にメモリを割り当てるだけで済みます。
コピー アルゴリズムの欠点:
コピー アルゴリズムはシンプルかつ効率的で、マーク アンド クリア アルゴリズムの効率の低さとメモリの問題を最適化します。デメリットは次のとおりです:
● メモリを元のサイズの半分に削減するため、メモリ空間の半分が無駄になります。コストが高すぎます。
● オブジェクトの生存率が非常に高い場合、極端な場合、オブジェクトの生存率が 100% であると仮定すると、オブジェクトのコピーにかかる時間コストは無視できません。
マーク-コレート アルゴリズム このアルゴリズムは、マーク/スイープ アルゴリズムと非常によく似ています。照合アルゴリズムは同じです。マーク/クリア アルゴリズムは同じですが、その後の手順では、リサイクル可能なオブジェクトを直接リサイクルするのではなく、残っているすべてのオブジェクトを一方の端に移動し、端の外側のメモリを直接クリーンアップします。
リサイクル可能なオブジェクトはリサイクル後にクリーンアップされ、残ったオブジェクトがルールに従ってメモリ内に配置されていることがわかります。このようにして、新しいオブジェクトにメモリを割り当てるとき、jvm はメモリの開始アドレスを保持するだけで済みます。マーク/オーガナイズ アルゴリズムは、マーク/クリア アルゴリズムのメモリ断片化の問題を補い、コピー アルゴリズムのメモリを半分にするという高コストを解消する、一石二鳥と言えます。
マーキング/整理の欠点:
● 非効率: 生き残ったオブジェクトをマークする必要があるだけでなく、生き残ったすべてのオブジェクトの参照アドレスもマークする必要があります。アルゴリズムをコピーするのではなく、効率の観点から。
世代別コレクション アルゴリズムの考え方は、オブジェクトの異なる生存サイクルに従ってメモリをいくつかのブロックに分割することです。一般に、Java ヒープは新世代と旧世代に分けられます (HotSpot の独自の実装である永続世代もあります。他の仮想マシン実装にはこの概念はありません。永続世代の収集効果は非常に大きくなります)永続世代は一般にガベージ コレクションがほとんど行われないため、各時代の特性に応じて最適なコレクション アルゴリズムが採用されます。
特徴:
新しい世代: 生まれては消え、生存時間は非常に短いです。レプリケーション アルゴリズムを使用して収集します。
古い世代: 複数のマイナー GC の後も存続し、存続期間が長くなります。マーク/クリア アルゴリズムまたはマーク/整理アルゴリズムを使用して、古い世代を収集します。
新しい世代でガベージ コレクションが実行されるたびに、多数のオブジェクトが死んだことが判明し、生き残るのはわずかです。したがって、コピー アルゴリズムを使用して新しい世代をリサイクルし、少量の労力のみでオブジェクトをコピーするコストでコレクションを完了できます。
古い世代のオブジェクトの生存率は高く、コピー アルゴリズムを使用するのは適切ではありません。また、古い世代がコピー アルゴリズムを使用すると、割り当て保証のための余分な領域がなくなるため、マーキングを使用する必要があります。/クリーン アルゴリズムまたはリサイクル用のマーク/照合アルゴリズム。
新世代のオブジェクトは「生きて死ぬ」ものです。GC が発生するたびに、多数のオブジェクトが消滅し、少数のオブジェクトが生き残ります。レプリケーション アルゴリズムが使用されます。新しい世代は、Eden エリアと Survivor エリア (Survivor from、Survivor to) に分かれており、サイズ比はデフォルトで 8:1:1 になります。
旧世代のオブジェクトの場合、オブジェクトの生存率が高く、割り当て保証のための余分な領域がないため、マーククリアまたはマーク補完アルゴリズムが使用されます。
新しく生成されたオブジェクトは最初に Eden 領域に入ります。Eden 領域がいっぱいの場合は、Survivor from が使用されます。Survivor from もいっぱいの場合は、マイナー GC (新世代 GC) が実行され、Eden と Survivor from に残っているオブジェクトがコピーされます。 . Survivor to を入力し、Eden と Survivor from をクリアします。このとき、元の Survivor from が新しい Survivor to になり、元の Survivor to が新しい Survivor from になります。コピー時に、Survivor がすべての存続オブジェクトに対応できない場合、オブジェクトは古い世代の割り当て保証 (銀行のローン保証と同様) に基づいて古い世代にコピーされます。古い世代が対応できない場合は、フル GC が実行されます。 (旧世代) が実行されます。GC)。
大きなオブジェクトが古い世代に直接入る: JVM にパラメータ設定があります
-XX:PretenureSizeThreshold なので、この設定値より大きいオブジェクトは古い世代に直接入ります。エデンエリアとサバイバーエリアの間の出来事、メモリコピー。
長期間存続するオブジェクトは古い世代に入ります: JVM はオブジェクトごとにオブジェクト年齢カウンターを定義します。Eden が誕生し、最初のマイナー GC を通過した後もオブジェクトがまだ存続し、Survivor によって収容できる場合は、生存者と年齢に移動し、1 に設定します。マイナー GC を生き延びていない場合、その年齢は 1 つ増加します。その年齢が特定のレベル (デフォルトは 15 歳で、XX:MaxTenuringThreshold で設定可能) に達すると、古い世代に移動されます。 。ただし、JVM は、古い世代に昇格する前に、年齢が最大年齢に達する必要があるとは限りません。Survivor 空間内の同じ年齢 (たとえば、年齢が x であるなど) のすべてのオブジェクトのサイズの合計が次の場合、 Survivor の半分を超えると、x 以上の年齢を持つすべてのオブジェクトは直接古い世代に入り、最大年齢要件まで待つ必要はありません。
世代別リサイクル:
object1 を使用して、世代別ガベージ コレクション アルゴリズムにおけるリサイクルの軌跡を示します。
1. Object1は新たに生成され、新世代のエデンエリアに誕生しました。
#2. マイナー GC、object1 はまだ生きており、From survivor スペースに移動されました。この時点ではまだ新しい世代です。
3. マイナー GC、object1 はまだ生きています。この時点で、object1 はコピー アルゴリズムを通じて ToSuv 領域に移動されます。時刻、object1 の年齢は 1 です。
4. マイナー GC、object1 はまだ生きています。この時点では、生存者内の object1 と同じ年齢のオブジェクトが生存者の半分に達していないため、今度は、コピー アルゴリズムを通じて、fromSuv と Tosuv 領域が交換され、残ったオブジェクトが Tosuv に移動されます。
5. マイナー GC、object1 はまだ生きています。この時点で、生存者の object1 と同じ年齢のオブジェクトが生存者の半分以上に達しています ( toSuv 領域がいっぱいです)、object1 は旧世代領域に移動されます。
#6. object1 が一定期間存続すると、現時点では object1 が GcRoots に到達できず、古い世代のスペース率がしきい値を超えていることがわかります。 MajorGC をトリガーします (fullGC であると考えることもできますが、ガベージ コレクターによって接続される必要があります)。この時点で、object1 はリサイクルされます。 fullGC はワールドの停止をトリガーします。
上記の新世代では、オブジェクトの年齢について言及しましたが、オブジェクトは生存状態で存続し、問題が発生するのを避けるために、すぐには旧世代のオブジェクトに昇格されません。影響が大きいため、昇格する前に次の条件を満たしている必要があります:
1. マイナー gc の後、存続エリアに存続するオブジェクトの年齢は 1 になります。(デフォルト) 15 を超えると、旧世代に引き継がれます。
2. 動的オブジェクト: Survivor スペース内の同じ年齢のすべてのオブジェクトの合計サイズが Survivor スペースの半分より大きい場合、その年齢以上のオブジェクトは古い世代に直接入ることができます。
以上がjvm のガベージ コレクション メカニズムとは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。