Java ガベージ コレクターのメソッドと原理の概要

高洛峰
リリース: 2017-01-17 15:36:32
オリジナル
1227 人が閲覧しました

Java ガベージ コレクターとは何ですか?

Java ガベージ コレクターは、Java 仮想マシン (JVM) の 3 つの重要なモジュールの 1 つであり (他の 2 つはインタープリターとマルチスレッド メカニズムです)、アプリケーション用のメモリ (メモリ割り当て) と自動リサイクル (ガベージ コレクト) 機能。どちらの操作も Java ヒープ上で実行されます (メモリの一部は高速です)。特定の時点で、オブジェクトがそれを指す複数の参照 (Rreference) を持っている場合、そのオブジェクトは生きています (Live)。それ以外の場合、そのオブジェクトは死んでおり (Dead)、ゴミとみなされ、次の方法でリサイクルして再利用できます。ガベージコレクター。ガベージ コレクション操作は CPU、スレッド、時間などのリソースを消費します。したがって、ガベージ コレクション操作はリアルタイムでは発生しません (オブジェクトは、メモリが消費されるか、特定の指標に達するとすぐに解放されます)。 (しきい値、合計メモリ比率に占める使用済みメモリの割合、たとえば 0.75)、ガベージ コレクション操作がトリガーされます。オブジェクトの終了には例外があり、java.lang.Thread 型のオブジェクトに参照がない場合でも、スレッドがまだ実行されている限りリサイクルされません。

リサイクルメカニズム

統計分析によると、Java (他の高級言語を含む) のほとんどのオブジェクトはライフサイクルが短いため、Java メモリは世代ごとに管理されます。世代別生成の目的は、異なる世代のメモリ ブロックに対して異なる管理戦略 (アルゴリズム) を使用して、パフォーマンスを最大化することに他なりません。古い世代に比べて、若い世代は通常、はるかに小さく、リサイクルの頻度が高く、スピードが速いです。旧世代はリサイクル頻度が低く、リサイクルに時間がかかります。メモリは若い世代に割り当てられ、複数のリサイクル サイクル後も存続する若い世代のオブジェクトは自動的に古い世代に昇格されます。

Java ガベージ コレクターのメソッドと原理の概要

設計の選択

設計の選択は、JVM ガベージ コレクターの実装の難しさと JVM のパフォーマンス指標に影響し、さまざまなシナリオに適しています。リサイクル アルゴリズムのスタイルの特徴について説明します。

シングルスレッドのシリアルリサイクル VS マルチスレッドのパラレルリサイクル

リサイクル操作自体がマルチスレッドであるかどうかの問題。シングルスレッドのリサイクルの利点は、シンプルで実装が容易で、断片化が少なく、シングルコア マシンに適していることです。マルチスレッドの並列リサイクルでは、マルチコア マシンの CPU リソースが最大限に活用され、リサイクル時間が短縮され、生産性が向上します。欠点は、複雑で一部のフラグメントがリサイクルされない可能性があることです。

リサイクル中にアプリケーションスレッドを一時停止する VS リサイクルとアプリケーションは同時に実行されます

リサイクル操作中にアプリケーションスレッドを一時停止するかどうかの問題。アプリケーション スレッドを一時停止することの利点は、単純さ、正確さ、比較的クリーンなクリーニング、および短いクリーニング時間です (CPU リソースが排他的になる)。欠点は、アプリケーション スレッドを一時停止すると、ガベージ コレクション サイクル中にアプリケーションの応答時間が長くなるということです。また、リアルタイム パフォーマンスは非常に高く、システムは比較的敏感です。リサイクルスレッドとアプリケーションスレッドの並列処理の利点は、アプリケーションの応答時間が比較的安定していることですが、欠点は、実装が難しく、クリーニング頻度が高く、フラグメントが発生する可能性があることです。

解放されたメモリセグメントをマージしない VS 解放されたメモリセグメントをマージする VS ライブセグメントを新しい場所にコピーする

これらの 3 つのオプションは、デッドメモリブロックセグメントを管理する方法を説明します。デッド メモリ フラグメントは通常、ヒープ全体に分散しています。管理されていない場合、使用可能なメモリの検索によりメモリの割り当てが遅くなり、メモリの無駄が発生します (大きな配列が必要になるなど)。連続したメモリセグメント)。管理には 2 つの方法があります。ライブ メモリをメモリ ブロックの一端に移動して、使用可能なメモリの開始位置を記録するか、ライブ メモリを新しいメモリ領域にコピーして、元のメモリ ブロックを空のままにする方法です。

パフォーマンスメトリクス

①、生産性(スループット)

より長い期間内の合計時間に対する非リサイクル時間の割合(より長い期間に意味があります)。システムの運用効率を測定します。

②、ガベージコレクションのオーバーヘッド(ガベージコレクションのオーバーヘッド)

長期にわたる合計時間に対するリサイクル時間の割合。生産性に相当し、合計すると 100% になります。

③、一時停止時間間隔 (一時停止時間)

Java 仮想マシンがガベージをリサイクルしているとき、一部のアルゴリズムはすべてのアプリケーション スレッドの実行を一時停止します。また、一部のシステムは一時停止間隔に敏感な場合があります。

④、回収頻度

リサイクル作業が行われるまでに平均してどのくらい時間がかかりますか。

⑤. 占有メモリのサイズ (フットプリント)

ヒープのサイズなど。

⑥、リアルタイム(即時性)

オブジェクトが消滅してから、そのオブジェクトが占有していたメモリがリサイクルされるまでにどれくらい時間がかかりますか。

ガベージ コレクションの種類

すべてのコレクター タイプは、世代別テクノロジーに基づいています。 Java HotSpot 仮想マシンには、Young Generation、Old Generation、Permanent Generation の 3 つの世代が含まれています。

①永続世代

にはクラス、メソッドとその記述情報が格納されます。 2 つのオプション オプション -XX:PermSize=64m および -XX:MaxPermSize=128m を使用して、初期サイズと最大値を指定できます。通常、このパラメータを調整する必要はありません。ただし、ロードされたクラスが多すぎて十分でない場合は、最大値を調整してください。

②旧世代

主に、存続し、複数のリサイクル サイクル後にアップグレードされるオブジェクトを若い世代に保存します。もちろん、一部の大規模なメモリ割り当ての場合は、それらのオブジェクトが永続世代に直接割り当てられることもあります (極端な例では、若い世代を次の世代に保存することはできません)。全て)。

③若い世代

ほとんどのメモリ割り当てとリサイクルアクションは若い世代で発生します。下図に示すように、若い世代はオリジナル エリア (Eden) と 2 つの小さな生存エリア (Survivor) の 3 つのエリアに分割されます。 2 つの生存エリアは機能に応じて From と To に分かれています。ほとんどのオブジェクトは元の領域に割り当てられ、複数回のガベージ コレクション操作で生き残ったオブジェクトは生存領域に配置されます。

Java ガベージ コレクターのメソッドと原理の概要

シリアルコレクター

シングルスレッドのリサイクル操作。リサイクル中にすべてのアプリケーションスレッドの実行を一時停止します。クライアントモードのデフォルトコレクターは、-XX:+UseSerialGC コマンドラインオプションの指定によって強制されます。

①若い世代のリサイクルアルゴリズム(マイナーコレクション)

Edenエリアに残っているオブジェクトをToエリアに移動します。Toエリアに収まらない場合は、FromエリアをToエリアに直接移動します。 To 領域が収まらない場合は、古い世代に直接移動すると、From 領域内の古い世代が古い世代にアップグレードされます。 リサイクルが完了すると、Eden 領域と From 領域は両方とも空になります。このとき、From と To の機能が入れ替わり、リサイクルの各ラウンドの前には To が空になります。デザイン選択はコピーです。

②旧世代(Full Collection)のリサイクルアルゴリズム

旧世代のリサイクルは、マーク(Mark)、クリア(スイープ)、マージ(コンパクト)の3ステップに分かれます。マーキング フェーズではすべての生きているオブジェクトにマークが付けられ、クリア フェーズではすべての死んだオブジェクトが解放され、マージ フェーズではすべての生きているオブジェクトが古い世代の前部分にマージされ、すべての空きセグメントが後ろに残ります。デザインの選択は、メモリの断片化を減らすためにマージされています。

パラレル コレクター

マルチコア環境で複数のスレッドを使用してガベージ コレクションを同時に実行すると、CPU リソースを最大限に活用し、リサイクル時間を短縮し、JVM の生産性を向上させることができます。サーバーモード。シリアル コレクターと同様に、コレクション中はすべてのアプリケーション スレッドの実行が一時停止されます。 -XX:+UseParallelGC コマンド ライン オプションによって強制されます。

①若い世代の収集アルゴリズム(マイナーコレクション)

は、複数のスレッドを使用してガベージを収集します。各スレッドのアルゴリズムはシリアルコレクターと同じです。

②旧世代のリサイクルアルゴリズム(フルコレクション)

旧世代もシリアルコレクターと同じシングルスレッドです。

並列圧縮コレクション

若い世代と古い世代のリサイクルはマルチスレッドで処理されます。コマンド オプション -XX:+UseParallelOldGC で指定すると、-XX:ParallelGCThreads=3 で、並列リサイクルに参加するスレッドの数をさらに指定できます。シリアル コレクターと同様に、コレクション中はすべてのアプリケーション スレッドの実行が一時停止されます。並列コレクターと比較して、旧世代の収集時間は短いため、一時停止時間の間隔 (Pause time) が短くなります。 –XX:+UseParallelOldGC コマンド ライン オプションによって強制されます。

①若い世代の収集アルゴリズム(Minor Collection)

は並列コレクター(Parallel Collector)と同じです

②古い世代のリサイクルアルゴリズム(Full Collection)

古い世代は3つに分かれていますステップ、マーク付き、統計、マージ。ここでは分割の考え方を使用して、古い世代を多くの固定サイズの領域に分割します。 マーキング フェーズでは、すべての生き残ったオブジェクトが N 個のグループ (リサイクル スレッドの数と同じである必要があります) に分割され、各スレッドは独自のグループを独立して担当し、生き残ったオブジェクトの位置と生存率情報をマークします。 Parallel としてマークされた領域 (Region)。統計段階では、各領域 (Region) の生存率がカウントされ、原則的に前方から後方に向かって、マージに値する開始位置 (大部分のオブジェクトが存在する領域) が見つかります。生きているものはマージする価値がありません)。統計フェーズではシリアル (シングルスレッド) です。マージフェーズでは、統計フェーズの情報に基づいて、複数のスレッドが、存続するオブジェクトを 1 つの領域 (Region) から別の領域 (Region) に並行してコピーします。

同時マークスイープ コレクター

低遅延コレクターとも呼ばれ、アプリケーションが一時停止される時間を最小限に抑えるためにさまざまな手段を使用します。リサイクル操作は基本的に、マージ操作やコピー操作を行わずに、アプリケーションと同時に実行されます。コマンド ライン -XX:+UseConcMarkSoupGC で指定すると、シングルコアまたはデュアルコア システムで増分リサイクル モード -XX:+UseConcMarkSweatGC を指定することもできます。増分リサイクルとは、リサイクル操作を複数のフラグメントに分割し、1 つのフラグメントの実行後に CPU リソースをアプリケーションに解放し、将来の特定の時点で最後の結果をリサイクルし続けることを指します。遅延を減らすことも目的です。

①若い世代の回収アルゴリズム(Minor Collection)

は並列コレクター(Parallel Collector)と同じです

②古い世代のリサイクルアルゴリズム(Full Collection)

は4つのステップに分かれており、初期マーク(Initial Mark)、同時マーク(Concurrent Mark)、リマーク(Remark)、同時スイープ(Concurrent Sweet)です。特にマージ操作がないため、断片化が発生することに注意してください。

初期化フェーズ: アプリケーション スレッドを一時停止し、残っているすべてのオブジェクトを検索します。これには短時間かかり、リサイクラーは単一のスレッドを使用します。

同時マーキング フェーズ: コレクターのマーキング操作はアプリケーションと同時に実行され、コレクターは単一のスレッドを使用してライブ オブジェクトをマークします。

再マーク: 同時マーキングフェーズ アプリケーションも実行されているため、このプロセス中にオブジェクトが追加または変更される可能性があります。したがって、アプリケーション スレッドを再度一時停止し、変更されたオブジェクトをすべて検索し、マルチスレッド マーキングを使用します。

同時クリーンアップ: リサイクラーのクリーンアップ操作はアプリケーションと同時に実行され、リサイクラーは単一のスレッドを使用して無効なオブジェクトをクリーンアップします。

Javaガベージコレクタ性能評価ツール

①–XX:+PrintGCDetailsと–XX:+PrintGCTimeStamps

各世代の開始時刻、期間、空きメモリなどの情報。

②jmap [オプション] pid

jamp 2043 2043 プロセスでロードされた共有オブジェクトを表示します。通常は DLL ファイルです。

jmap -heap 2043 メモリ ヒープの構成情報と使用状況を表示します。

jmap -permstat 2043 永続世代のロード状況を確認します。

jmap -histo 2043 クラスの読み込みとメモリ使用量を確認します。

③jstat [オプション] pid

jstat -class 2043 クラスのロード、アンロード、メモリ使用量。

jstat -gc 2043 GC の実行ステータス。

追記

Javaには自動選択機能と自動パフォーマンス最適化機能があります。ガベージ コレクターを調整する前に、まず懸念するパフォーマンス インジケーターをリストし、コマンド ラインを通じて JVM に通知します。満足できない場合は、ガベージ コレクターを指定できます。 。 OutOfMemory は通常、ヒープ メモリの不足によって発生します。 -Xmx1024m および -XX:MaxPermSize=128m コマンド ライン オプションを調整するだけです。

以上がこの記事の全内容です。皆さんの学習に役立つことを願っています。また、皆さんも PHP 中国語 Web サイトをサポートしていただければ幸いです。

Java ガベージ コレクターのメソッドと原理に関するその他の関連記事については、PHP 中国語 Web サイトに注目してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート