jvm のガベージ コレクション メカニズムとは何ですか?
jvm のガベージ コレクション メカニズムは GC (ガベージ コレクション) であり、ガベージ コレクターとも呼ばれます。 GC の基本原理: メモリ内で使用されなくなったオブジェクトをリサイクルします。GC でリサイクルする方法はコレクターと呼ばれます。GC はある程度のリソースと時間を消費する必要があるため、Java はオブジェクトのライフサイクル特性を分析し、オブジェクトに従います。アプリケーションへの GC による一時停止をできるだけ短くするために、新世代と旧世代で収集されます。
ガベージ コレクションとは
C 言語や C 言語と比較した Java の利点の 1 つは、ガベージ コレクターが付属していることです。ガベージ コレクションとは、ヒープを削除することを指します。アクセスできないオブジェクトをクリーンアップします。到達不能なオブジェクトは、すぐには直接リサイクルされません。Java プログラムでのガベージ コレクターの実行は自動であり、強制することはできません。プログラマができる唯一のことは、System.gc メソッドを呼び出してガベージ コレクターの実行を提案することです。 , しかし、実行できるかどうか、いつ実行されるかは不明です。これはガベージ コレクターの主な欠点でもあります。もちろん、この欠点は、プログラマにもたらす大きな利便性によって補われます。ガベージ コレクションが必要な理由
jvm ガベージ コレクションの原則
JVM ランタイム データ領域にはヒープ領域があり、ヒープは巨大なオブジェクト プールです。このオブジェクト プールでは膨大な数のオブジェクト インスタンスが管理されており、プール内のオブジェクトの参照レベルの一部は非常に深いものです。頻繁に呼び出されるインターフェースは、毎秒非常に高い速度でオブジェクトを生成すると同時に、オブジェクト間の関係が巨大なネットワークを形成します。 Java は無限のメモリの雰囲気を作り出していますが、オブジェクトは減らずに増加するだけではないため、ガベージ コレクションが必要です。では、JVM はどのオブジェクトをリサイクルする必要があるかをどのように判断するのでしょうか?どれを保管すべきでしょうか?これには、JVM のガベージ コレクション メカニズムを使用する必要があります。これは、多くの場合 GC (ガベージ コレクション) と呼ばれるもので、ガベージ コレクターとも呼ばれます。 GC (ガベージ コレクション) の基本原理: メモリ内で使用されなくなったオブジェクトを再利用します。GC で再利用する方法はコレクターと呼ばれます。GC はある程度のリソースと時間を消費するため、分析後、オブジェクトのライフサイクル特性に応じて、Java はアプリケーションへの GC による一時停止を可能な限り短縮するために、新世代と旧世代に従ってオブジェクトを収集します。#● 新世代へのコレクションオブジェクトのコレクションはマイナー GC
と呼ばれます。 ● 古い世代のオブジェクトのコレクションはフル GC と呼ばれます。 ● プログラム内で System.gc() を積極的に呼び出すことによって強制される GC はフル GC
です。オブジェクト参照タイプ、GC はリサイクルにさまざまな方法を使用します。JVM オブジェクト参照は 4 つのタイプに分類されます:
● ソフト参照: ソフト参照は、キャッシュ シナリオに適した Java で提供されるアプリケーションです (メモリが十分でない場合にのみ GC が行われます)
● 弱い参照: 確実にGC 中に GC によってリサイクルされる
● 仮想参照: 仮想参照は、オブジェクトが GC されたかどうかを知るためにのみ使用されるため、
#オブジェクトはガベージ メソッドとしてマークされますJVM のメモリ構造には 5 つの主要な領域が含まれます: プログラム カウンター
、仮想マシン スタック、
ローカル メソッド スタック,
ヒープ領域 、
メソッド領域 。このうち、プログラムカウンタ、仮想マシンスタック、ローカルメソッドスタックの3領域はスレッドによって生成・破棄される領域であるため、これらの領域のメモリ割り当てとリサイクルは決定的であり、リサイクル問題を考慮する必要はありません。メソッドが終了するかスレッドが終了すると、メモリは自然にリサイクルされるため、あまりにも多すぎます。 Java ヒープ領域とメソッド領域は異なり、メモリのこの部分の割り当てとリサイクルは動的であるため、ガベージ コレクターはこれに注目する必要があります。
参照カウントは、ガベージ コレクターの初期の戦略です。このアプローチでは、ヒープ内の各オブジェクト インスタンスには参照カウントがあります。オブジェクトが作成されると、オブジェクト インスタンスが変数に割り当てられ、変数の数が 1 に設定されます。他の変数にこのオブジェクトへの参照が割り当てられている場合、カウントは 1 増加します (a = b、b によって参照されるオブジェクト インスタンスのカウンタは 1)。ただし、オブジェクト インスタンスの参照がライフ サイクルを超えた場合、または新しい値に設定され、オブジェクト インスタンスの参照カウンタは 1 ずつ減分されます。参照カウンタが 0 のオブジェクト インスタンスはすべて、ガベージ コレクションの対象になります。オブジェクト インスタンスがガベージ コレクションされると、それが参照するオブジェクト インスタンスの参照カウンタが 1 つ減ります。
利点: 参照カウント コレクターは迅速に実行でき、プログラムの実行と連動します。プログラムを長時間中断する必要がないリアルタイム環境では、より有益です。
欠点: 循環参照を検出できません。親オブジェクトが子オブジェクトへの参照を持っている場合、子オブジェクトは親オブジェクトを参照します。このようにすると、参照カウントが 0 になることはありません。
# 参照カウントを通じて上記のコードを分析します。
##2. 到達可能性分析
到達可能性アルゴリズムは、現在の主流の仮想マシンで使用されるアルゴリズムであり、すべての参照関係を処理するプログラムです。ノード GC Roots から開始して、対応する参照ノードを検索します。このノードが見つかったら、引き続きこのノードの参照ノードを検索します。すべての参照ノードが検索されると、残りのノードは参照されていないノード、つまり無駄なノードはリサイクル対象と判断されます。 Java 言語では、GC ルートとして使用できるオブジェクトは次のとおりです: ● 仮想マシン スタック (スタック フレーム内のローカル変数テーブル) で参照されるオブジェクト;
●メソッド領域 クラスの静的プロパティによって参照されるオブジェクト;
● メソッド領域の定数によって参照されるオブジェクト;
● ローカル メソッド スタック内の JNI (ネイティブ メソッド) によって参照されるオブジェクト。
3. ガベージ コレクション アルゴリズム
1. マーククリア アルゴリズム
マーク/クリアの基本的な考え方アルゴリズムは次のとおりです。同じ名前を持ち、「マーキング」と「クリア」の 2 つの段階に分かれています。最初に、リサイクルする必要があるすべてのオブジェクトにマークを付けます。マーキングが完了すると、マークされたすべてのオブジェクトが均一にリサイクルされます。
マーキング ステージ: マーキング プロセスは、実際には、前に紹介した到達可能性分析アルゴリズムのプロセスであり、すべての GC Roots オブジェクトを横断し、各 GCRoots からオブジェクトに到達できるようにします。オブジェクトは、通常はオブジェクトのヘッダーに識別子でマークされ、到達可能なオブジェクトとして記録されます。
クリアリングフェーズ: クリーニングプロセスはヒープメモリを走査することで、オブジェクトが到達可能なオブジェクトとしてマークされていないことが判明した場合、(オブジェクトを読み取ることによって)ヘッダー情報)があれば再利用されます。
ガベージ コレクターが GC を実行するときは、すべての Java 実行スレッドを停止する必要があります (「ストップ ザ ワールド」とも呼ばれます)。これは、マーキング フェーズ中に到達可能性解析が実行されると、その間にオブジェクト参照関係を維持できないためです。解析処理の条件を変更した場合、リーチャビリティ解析結果の精度は保証できません。アプリケーション スレッドは、マークがクリアされるまで実行を再開しません。
マーク/クリア アルゴリズムの欠点: ●
効率の問題 マーキングとクリアの 2 つのフェーズの効率両方のステージでメモリ内のオブジェクトを走査する必要があり、多くの場合、メモリ内のオブジェクト インスタンスの数が非常に多くなり、間違いなく非常に時間がかかり、GC 中にアプリケーションを停止する必要があるため、クリアはそれほど高くありません。これはユーザー エクスペリエンスを非常に低下させることになります。
●
スペースの問題 マークをクリアすると、不連続なメモリの断片が大量に生成されます (上図からわかるように)。より大きなオブジェクトを割り当てる場合、不十分な連続メモリが見つからないため、別のガベージ コレクション アクションを早めにトリガーする必要があります。
2. コピー アルゴリズム
コピー アルゴリズムは、容量に応じて利用可能なメモリを 2 つの同じサイズのブロックに分割し、一度に 1 つのブロックを使用します。このメモリ ブロックが使い果たされると、残っているオブジェクトを別のメモリ ブロックにコピーし、このメモリ ブロック内のすべてのオブジェクトを一度にクリーンアップします。コピー アルゴリズムは毎回半分のエリア全体のメモリをリサイクルするため、マークされたオブジェクトをトラバースする時間が短縮されます。使用済みエリア オブジェクトをクリアする場合、トラバースする必要はなく、エリア全体のメモリが直接クリアされます。残ったオブジェクトがコピーされます 予約領域もアドレス順に格納されるため、メモリの断片化の問題が解決されます オブジェクトのメモリを割り当てる際、メモリの断片化などの複雑な問題を考慮する必要はありません 順番にメモリを割り当てるだけで済みます。
コピー アルゴリズムの欠点:
コピー アルゴリズムはシンプルかつ効率的で、マーク アンド クリア アルゴリズムの効率の低さとメモリの問題を最適化します。デメリットは次のとおりです:
● メモリを元のサイズの半分に削減するため、メモリ空間の半分が無駄になります。コストが高すぎます。
● オブジェクトの生存率が非常に高い場合、極端な場合、オブジェクトの生存率が 100% であると仮定すると、オブジェクトのコピーにかかる時間コストは無視できません。
3. マーク-コレート アルゴリズム
マーク-コレート アルゴリズム このアルゴリズムは、マーク/スイープ アルゴリズムと非常によく似ています。照合アルゴリズムは同じです。マーク/クリア アルゴリズムは同じですが、その後の手順では、リサイクル可能なオブジェクトを直接リサイクルするのではなく、残っているすべてのオブジェクトを一方の端に移動し、端の外側のメモリを直接クリーンアップします。
リサイクル可能なオブジェクトはリサイクル後にクリーンアップされ、残ったオブジェクトがルールに従ってメモリ内に配置されていることがわかります。このようにして、新しいオブジェクトにメモリを割り当てるとき、jvm はメモリの開始アドレスを保持するだけで済みます。マーク/オーガナイズ アルゴリズムは、マーク/クリア アルゴリズムのメモリ断片化の問題を補い、コピー アルゴリズムのメモリを半分にするという高コストを解消する、一石二鳥と言えます。
マーキング/整理の欠点:
● 非効率: 生き残ったオブジェクトをマークする必要があるだけでなく、生き残ったすべてのオブジェクトの参照アドレスもマークする必要があります。アルゴリズムをコピーするのではなく、効率の観点から。
4. 世代別コレクション アルゴリズム
世代別コレクション アルゴリズムの考え方は、オブジェクトの異なる生存サイクルに従ってメモリをいくつかのブロックに分割することです。一般に、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 サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Java の Weka へのガイド。ここでは、weka java の概要、使い方、プラットフォームの種類、利点について例を交えて説明します。

この記事では、Java Spring の面接で最もよく聞かれる質問とその詳細な回答をまとめました。面接を突破できるように。

Java 8は、Stream APIを導入し、データ収集を処理する強力で表現力のある方法を提供します。ただし、ストリームを使用する際の一般的な質問は次のとおりです。 従来のループにより、早期の中断やリターンが可能になりますが、StreamのForeachメソッドはこの方法を直接サポートしていません。この記事では、理由を説明し、ストリーム処理システムに早期終了を実装するための代替方法を調査します。 さらに読み取り:JavaストリームAPIの改善 ストリームを理解してください Foreachメソッドは、ストリーム内の各要素で1つの操作を実行する端末操作です。その設計意図はです

Java での日付までのタイムスタンプに関するガイド。ここでは、Java でタイムスタンプを日付に変換する方法とその概要について、例とともに説明します。

カプセルは3次元の幾何学的図形で、両端にシリンダーと半球で構成されています。カプセルの体積は、シリンダーの体積と両端に半球の体積を追加することで計算できます。このチュートリアルでは、さまざまな方法を使用して、Javaの特定のカプセルの体積を計算する方法について説明します。 カプセルボリュームフォーミュラ カプセルボリュームの式は次のとおりです。 カプセル体積=円筒形の体積2つの半球体積 で、 R:半球の半径。 H:シリンダーの高さ(半球を除く)。 例1 入力 RADIUS = 5ユニット 高さ= 10単位 出力 ボリューム= 1570.8立方ユニット 説明する 式を使用してボリュームを計算します。 ボリューム=π×R2×H(4

Spring Bootは、Java開発に革命をもたらす堅牢でスケーラブルな、生産対応のJavaアプリケーションの作成を簡素化します。 スプリングエコシステムに固有の「構成に関する慣習」アプローチは、手動のセットアップを最小化します。
