[JVM] 5ギャング小さな白Xuechengガベージコレクタとメモリ割り当て戦略

ガベージコレクションのアルゴリズムの前に導入され、その後、我々は戦略ガベージコレクションとメモリの割り当てをご紹介します。銀の弾丸Niubiコレクタは、すべてのシーンのようにフィット感がありますか?もちろん、そこにはあることができ、または私はガベージコレクタを導入する別の記事に従事する必要はありませんでした。異なるコレクターの長所と短所を熟知し、実際の場面での柔軟な使用は、王です。

ガベージコレクタを導入開始する前に、我々はポイントをスポイラーことができます。

  • 世代コレクタの特性に応じて異なっていてもよいです。一部のコレクターは、古いものと新しい世代の同時に使用することができますが、コレクターや古い年代の新しい世代のための適切な選択、それぞれに必要な場合があります。一般的には、コレクターの収集高周波の新世代は、コレクタの効率的なパフォーマンスで使用する必要があり、昔を収集するために、比較的低いコレクタをね、スペースに敏感、コレクタがベースのレプリケーションアルゴリズムを選択避けるべきです。
  • 時間ガベージコレクションの実行時に、アプリケーションが一時停止を実行する必要があります
  • これは、連続的に収集することができ、あるいは並行して収集します。
  • あなたは同時コレクタ(アプリケーションが一時停止する必要はありません)を行うことができれば、それは間違いなく非常に素晴らしいことです。
  • 行動のコントロールのコレクションならば、それはとても素晴らしいことです。

私はより多くを得るかもしれない、読書目標は、次の質問を読んで願っています。

  1. なぜ銀の弾丸に退行コレクタは、すべてのシーンのようにフィット感がありますか?
  2. コントラストCMSとG1は、あなたが彼あなたの二つの違いを知っていますか?
  3. なぜCMSはコレクターの古いとして使用することができますが、新世代のコレクションに適用することはできませんか?
  4. なぜJVM世代15歳?代わりにそれのような16、20の?
  5. 「動的対象年齢の決意は、」「は陥没穴」ああ、何ピット、それを?

1つのガベージコレクタ

GCスレッドとアプリケーション・スレッドは、システムが、ガベージコレクションのタスクを実行するワーカースレッドを停止する必要がある場合に、比較的独立したまま、その後、GCスレッドの作業を命令します。動作の連続モードを収集する、と呼ばれるシリアルコレクタ(即ちコレクタシリアル)動作の対向する平行モードがトラップである、と呼ばれるパラレルコレクタ(即ちコレクタParaller)

1.1シリアルコレクター:シリアル

GCスレッドで収集して動作するシリアルコレクタシングルスレッドアプローチ、スレッド・システムは、アプリケーションが気にすることはできません。この場合、アプリケーションが一時停止状態になり、すなわちストップの世界を。

ストップ・ワールドタイムの​​ポーズ長を、それがのコレクタパフォーマンスのレベルの重要な指標の尺度です。

レプリケーションのアルゴリズム-これは、ラベルに基づいて、ガベージコレクタの新しい世代のためです

1.2平行コレクター:ParNew

パラレルコレクタは、複数のプロセッサの並列GCのコレクション内の複数のスレッドの使用を利用します。一つは、実行のGCスレッドの数を想像することができ、明らか実行の唯一のGCスレッドを使用するよりも効率的です。一般に、シリアルアキュムレータと比較して、パラレルコレクタ下マルチプロセッサ環境で動作が大幅ストップ世界の時間を短縮することができます。

以下のために新世代ガベージコレクタのマーク-複製アルゴリズム、シリアルのマルチスレッド・バージョンとして見ることができます

1.3スループット優先コレクター:パラレル清掃を

以下のための新世代のガベージコレクタの複製アルゴリズム-マーク、および類似ParNewが、スループットをより重視。ParNewに基づいて「スループット優先」コレクタとして知られているパラレルScanvengeコレクタを進化。スループットは、即ち、合計経過時間とユーザコード比率を実行するために使用されるCPUのCPU時間であるユーザコード/(ユーザコード実行時間+時間ガベージコレクション)を実行=一定時間そのような100分の仮想マシンの実行中の合計として、ガベージコレクタは、スループットが99%で1分を費やします。

平行Scanvenge ParNewコレクタは、所望の収集時間又はスループットを構成するために使用されるパラメータのセットに基づいて設けられており、この目標を集め。

おおよその範囲は、特定のVMオプションによって制御されてもよいです。

  • -XX:MaxGCPauseMills:所望の時間制限を収集します。一時停止を収集するために、アプリケーションへの影響を制御するために使用します。
  • -XX:GCTimeRatio:スループットを制御するために使用される所望の合計時間のGC比は、。
  • -XX:UseAdaptiveSizePolicy:サイズ調整ポリシーの自動生成。

しかし、時間を一時停止し、これらの2つの目的は、休止時間を減少させるために反対しているスループットに注意を払うことも、スループットの低下の原因となります。合理的な範囲で制御をターゲットにする必要があります。

1.4シリアル・オールド・コレクター

シリアルシリアル旧のコレクターであるの古い使用して、バージョン、シングルスレッドのコレクター照合アルゴリズム-マークこれの主な意義は、クライアント・モードでの仮想マシンへのコレクタが使用することです。

1.5パラレルオールド・コレクター

パラレル旧パラレルScanvengeコレクターであるの古いバージョン、マルチスレッドコレクタ、使用してソートアルゴリズム-マーク

1.6 CMSコレクター

CMS(並行マークスイープ)は、最短目標復旧時間のためのコレクターが収集を一時停止しています

CMSコレクタはのみに作用するの古いコレクションに基づいているマーク-スイープアルゴリズム、およびその動作方法は、4つのステップに分かれています。

  • 初期マーク(CMS初期マーク)
  • 並行マーク(CMS並行マーク)
  • ラベル変更(CMSの発言)
  • 同時クリア(CMS同時スイープ)

このうち、最初のマーカーは、再マークこれらの2つのステップはまだストップ世界をする必要があります。最初のマークがちょうどGCのルーツに直接リンクすることができますどのオブジェクトマークし、非常に高速で、コンカレントマークフェーズが進行GCのルーツトレースであり、再マークフェーズは、ユーザプログラムが動作し、リードマークを生成し続けて補正期間並行マークのための原因であります、オブジェクトの変更の一部にそれらをマーク初期段階のいくつかより少し長く、一般的に、この段階での滞留時間が、同時マーク時間よりも短いです。

スプリットパイプライン方式CMS収集サイクル、保持動作ユニットが同時にスレッドを実行して、時間のかかるアプリケーション。唯一のSTW操作部だけで実行するために必要なものは、適切なタイミングで実行されている制御ユニットを実施する、とだけ短い時間で完了することを保証します。このように、全体の収集期間、唯一の2つの短い休止(初期マーキングおよび再マーキング)目的おおよその同時を達成します

CMSコレクタの利点:同時コレクション、低停止。

CMSコレクタ短所

  • CMSコレクタは、CPUリソースに非常に敏感です。
  • CMSのガベージコレクタは、フローティング(浮遊ゴミ)を処理することはできません。
  • CMSコレクターがマークに基づいている - スイープアルゴリズム、アルゴリズムには欠点があります。

CMSコレクタは、単にので、並列性を達成することができました「マーク-スイープ」ベースのアルゴリズムとアルゴリズムの分解プロセスは、きめの細かいです章では、以前のマークを導入-スイープアルゴリズムは、メモリの断片化の多くが生成されます、この新しい世代は受け入れられないので、コレクターCMSバージョンの新世代を提供していません。

1.7 G1コレクタ

G1は、ヒープを再定義し、ヒープは、1つの領域に分割されて、元のモデルを破る世代。目標は、その最も顕著な特徴であるフルスタック、中にコレクションの範囲内で必要ありません。ゾーニングの利点は、予測モデルのコレクションの休止時間をもたらすことです。コレクションを指定することができ、ユーザーはどのくらい終了します。すなわち、G1は、プロパティのリアルタイム収集の近くに提供します。

ここで次のようにG1とCMSの比較は以下のとおりです。

機能 CMS G1
並行と世代 それはあります それはあります
ヒープメモリの解放を最大にするために、 それはあります ノー
低レイテンシー それはあります それはあります
スループット 高いです 低いです
コンパクション それはあります ノー
予測可能性 強いです 弱いです
物理的な分離と古い時代の新世代 ノー それはあります

G1は、次の特性があります。

  • 並列並行:G1は、他のコレクターのいくつかは、元のJavaスレッドの実行GCの操作を一時停止する必要があり、ストップ世界の休止時間を短縮するために、環境内の複数のCPUの使用をマルチCPU、マルチコアハードウェアの利点をフルに活用することができ、G1コレクターまだできる同時 Javaプログラムが道を実行し続けてみましょう。
  • 世代別コレクション
  • 空間統合:マークとCMS -クリア異なるアルゴリズムが、G1は、全体に基づいてマーク-照合アルゴリズムのコレクタ実装、「ローカルから(間の2つの地域)のビューに基づいてコピー」アルゴリズムの実装。いずれにせよ、これら2つのアルゴリズムは、G1の動作中に何のメモリスペースデブリを意味しない、コレクションが可能な通常のメモリを提供しています。この機能は、彼らが大きなオブジェクトを割り当てるとき途中で次のGCをトリガ連続したメモリ空間を見つけることができないではないので、長時間実行されるプログラムを助長しています
  • 予測可能な一時停止:これは、滞留時間は、共通のG1とCMSの懸念で減少、G1 CMSに関して有利です。

G1の前に、他のコレクターのコレクションの範囲は全く新しい世代のか古いのではない、とG1はもはやケースです。等しいサイズの複数に積層体の構造設計にGLが収集新世代又は老齢の従来の固定モード範囲の単位面積を破る場合、消化器ヒープ、各ユニットは、リージョンと呼ばれています。領域はG1モジュール組成物は、以下に示す、連続したメモリ空間のアドレスです。

G1スタックレイアウトの.pngリージョン

また、もはや物理的に分離されていない新しい世代と古い時代の概念が、新世代と旧年をそこに保持されているものの、G1コレクタ全体のJavaヒープは、独立したエリア(地域)同じサイズの複数に分割され、彼らはの一部でありますリージョン(必ずしも連続しない)に設定。Javaを通じて地域全体のヒープのガベージコレクションを避けるために計画することができるので、G1コレクタモデルは、予測可能な休止時間を確立することができましたG1は、各領域のコストを計算するために、収集され、量子化された合理的な計算モデルを通過するように、その「休止」時間制限は、常に収集領域として適切なセットを選択し、所与のコレクタケースで目標、コレクションのオーバーヘッドをリアルタイムに収集の目的を達成するために、この制約を満たしてみましょう。

CMSまたはParallelOldコレクタアプリケーションから移行意向については、公式より良い性能の追求にG1コレクタを交換することが考えられる次のような特性を順守することが分かった場合、お薦め:

  • リアルタイムデータは、ヒープ領域の半分以上を占めます。
  • オブジェクトの割当比率または大幅に「昇格」速度変更。
  • ( - 1秒以上0.5)長い又はGC一時停止を排除することを望みます。

原文如下:
アプリケーションは、以下の特徴の一つ以上を持っている場合、CMSやParallelOldのガベージコレクタのいずれかで、今日を実行しているアプリケーションは、G1への切り替え恩恵を受けるだろう。

  • Javaヒープの50%以上は、ライブデータで占められています。
  • オブジェクト割り当て率やプロモーションの割合が大幅に変化します。
  • 望ましくない長いガベージコレクション又はコンパクション休止(0.5〜1秒以上)

次のようにG1集合演算処理は次のようになります。

  • 初期マーク(初期マーキング)ユーザプログラムの次の段階が同時に実行されるように、あなたは地域で利用可能修正することができ、オブジェクトがマークだけで何GCのルーツは、直接にリンクすることができている、とTAMS(マーク・スタートで次の上位)の値を変更し、:新しいオブジェクトを作成し、この段階では停止スレッドが必要ですが、それは非常に短くなります
  • 並行マーク(マーキング同時):ヒープオブジェクトの到達可能性解析の初めからGCルーツはライブオブジェクトを識別するために、この段階では長い時間がかかりますが、ユーザプログラムの実行によって複雑にすることができます。
  • 最終マーク(マーキング決勝):により生成された記録マークの部分の著しい変化をもたらし継続動作に並行マーク中のユーザプログラムの修正、仮想マシンのこの時間の間、内部の設定ログ思い出しスレッドで記録されたオブジェクトの変更、する必要の最終段階をマーキング覚えの設定に組み込ま思い出しセットのログデータこの段階では、スレッドを停止する必要がありますが、並行して実行することができます
  • (ライブデータと避難を数える)のリサイクルをフィルター:まず、回復値と各地域のコストは、ユーザ希望GCの一時停止に応じたリサイクルプログラムを開発するために、ソートします。この段階では、ユーザプログラムと並行して行うことができますが、唯一の地域の一部を回収するので、時間はユーザが制御可能であるが、大幅に収集効率を強化するユーザスレッドを停止します。

我々は(この説明は、比較的簡単な英語で、私は翻訳されません)G1のための公式ドキュメントの見通しを見ることができます。

未来:
G1は並行マークスイープコレクター(CMS)のための長期的な代替として計画されています。CMSとG1を比較すると、G1よりよい解決策作りの違いがあります。一つの違いは、G1は圧縮コレクタであることです。G1成形体は十分に完全に配分のためのきめ細かな空きリストの使用を避けるために、代わりに地域に依存しています。これはかなりコレクタの部品を簡素化し、主に潜在的な断片化の問題を解消します。また、G1は、CMSコレクタより予測可能なガベージコレクションの一時停止を提供し、ユーザーが希望のポーズターゲットを指定することができます。

2メモリ割り当て戦略

メモリ割り当ての対象は、一般的な方向に言えば、それは、あるヒープ(間接的に可能ならばスカラー型後のJITコンパイラの休憩を経て、割り当てのスタック割り当てに)、新世代のエデンの領域に割り当てられた主なターゲットあなたが開始した場合、スレッドローカルバッファ割り当て、優先順位がTLABにスレッドが割り当てられます。まれなケースでは、古い時代に直接割り当てることができます。

エデン2.1オブジェクト優先配分

多くの場合、エデンエリア内のオブジェクトの割り当ての新世代。エデン領域が割り当てられて十分なスペースでない場合は、仮想マシンはマイナーGC(前の章では、マイナーGCを導入している)を起動します。しかし、中ケースもあり、メモリの保証メカニズムは、オブジェクトは、古い時代に直接配置することはできません。

古い年に2.2ラージオブジェクトを直接

ラージオブジェクトのJavaオブジェクトを参照すると、連続した大量のメモリ空間を必要とし、大きなオブジェクトの最も典型的には、長い文字列と配列の一種です。

オブジェクトは、古い年に直接割り当てられた設定値よりも大きくなるように、PretenureSizeThresholdパラメータ:仮想マシンは、-XXを提供します目的は、メモリ複製の多くは、エデンと2つのサバイバー領域の間の領域に発生しないようにすることです。

オブジェクトの2.3長期生存率は、古い年を入力します

各オブジェクトの仮想マシンは、対象年齢(年齢)カウンタを定義します。オブジェクトがエデンで生まれ、最初のマイナーGC後にまだ生きている、とサバイバーを収容することができたならば、それはサバイバースペースに移動されますと、年齢が1に設定されています。エリア内のサバイバーのオブジェクトはマイナーGCを通過し、プラスの年齢の1年、15歳の年齢(デフォルト値)に達したとき、それは古い時代に昇格されるわけではありませんでした。

オブジェクトの昇格老齢しきい値、パラメータは-XXことができます:MaxTenuringThreshold設定。

次は、なぜ、なぜJVM世代15歳に答える必要がありますか?代わりにそれのような16、20の?

他ではないが、実際に(15を除く)の数ではないことができますなぜ、確かにChenqieああやります!

それは、そのようなハッシュコード(ハッシュコード)のようなオブジェクト自体のデータを格納するためのオブジェクトのHotSpot VMランタイムヘッダ部である方法、GC世代年齢ロック状態フラグスレッドがロックを保持して、スレッドIDバイアス、偏向タイムスタンプ、32ビットおよび64ビットの仮想マシン(圧縮されたポインタを開けていない)内のデータの長さのこの部分は、それぞれ、32ビットおよび64ビットのため、正式「と呼ばれるマークのWord。」

オブジェクトがアンロック状態にある場合、例えば、32ビットのHotSpot仮想マシンで、次にオブジェクトを格納するためのマークワード32ビット25bit空間がコード、ハッシュオブジェクトを格納するための4ビット世代年齢を 2ビットを記憶するための、ロックフラグは、1ビットは0に固定されています。

あなたはなぜまだ理解できますか?対象の年齢の4、つまり、0000のための世代会計は、1111年の最大値は、好きに15、16、20と不可能なまでです。

動的オブジェクトの2.4時代の決意

よりよい異なる条件プログラムメモリに適応するためには、仮想マシンは常に歳以上の現金を必要としないMaxTenuringThresholdの歳のプロモーションの前に到達する必要があります。

次のいずれかの条件を満たしている、オブジェクトは、古い年に昇格することができます。

  • 1.オブジェクトを促進することができる歳(15デフォルト)年齢MaxTenuringThresholdに達しました。
  • 2.同じ年齢のサバイバースペースの合計は、年齢よりも大きいか、あなたが、直接要件の年齢MaxTenuringThresholdまで待つ必要が歳行くことはできない年齢オブジェクトに等しいスペースサバイバー内のすべてのオブジェクトの半分のサイズよりも大きい場合。

多くの記事は、ちょうどこのような状況にノート取っている(アリミドルウェア公衆番号がちょうどこの簡単な導入を記事を出し含むが、その後、状況を説明する言葉をオフのままに戻ってそれらを与える)が、そう理解している場合にのみ、あなたは見つけるでしょう実際のメモリの回復におけるこの規定に反します。

6歳の20%を占め、28%を占め、そのような対象年齢5のような小さな栗については、7歳、52%は、二つの基準によると、オブジェクトは古い時代に入ることができない、しかし100%までサバイバーああ持っています

私たちは、このパラメータに焦点を当てることができTargetSurvivorRatio、生存率のターゲット、デフォルトは50%です小さいから、そのような(例えば7歳で栗など)の後に、特定の年齢を追加として年齢の大きい蓄積にほぼことを意味する、、、**サバイバー* TargetSurvivorRatio空間以上の総占有時代の始まりと必要以上に大きく対象の年齢からの時間、 (7つのオブジェクトの年齢にすなわち栗)歳に入ります。主にTargetSurvivorRatioにこのパラメータを制御することにより、動的なオブジェクトの年齢推定。また、むしろ、対象年齢の大きさよりも、小規模から大規模な累積に年齢だったと考えます。**

2.5スペース割り当て保証

この条件が満たされた場合、それが発生する前にマイナーGC、古い仮想マシンの最大利用可能な連続スペースが総容量の新世代内のすべてのオブジェクトよりも大きいかどうかを最初のチェックは、その後、マイナーGCは、それが安全であることを確認します。満たされていない場合は、仮想機会がHandlePromotionFailureの設定が失敗したことを保証できるようにするかどうかを確認します。許可された場合、それは前の歳より大きいの古い最大利用可能な連続スペースがより大きい場合には、オブジェクトの平均サイズに昇進したマイナーGCにもかかわらず、マイナーGCを実施しようとするかどうかをチェックしていきますでリスクの;未満ならば、またはHandlePromotionFailureの設定がリスクを許可しない、それが一度に変更する必要があるのフルGC

上記言われて何、リスクはありますか?私たちは、コピーコレクションアルゴリズムの新世代を使用するが、メモリの使用率のためには、その状況はマイナーGC内のオブジェクトの多くは、まだ(最も極端なケースが生きているときに、メモリの回復は、新生児を表示され、バックアップとして回転させるために一つだけサバイバースペースを使用することを知っています)すべてのオブジェクトが生きているのに代わって、あなたは、古い時代に直接サバイバーのオブジェクトに対応できない、保証歳割り当てられる必要があります。

3.まとめ脳機能マッピング

メモリ割り当て戦略.PNG

あまりにも脳機能マッピングは、高精細フルサイズの画像の場合は、通知メッセージを残してください。

おすすめ

転載: www.cnblogs.com/heyonggang/p/11427994.html