素人の言語のJava仮想マシンで(5)G1のガベージコレクタ

この記事はもちろんノートの「素人の言語、Java仮想マシン」シリーズで、侵略を削除しました。アドレスを学習簡単な言葉でJava仮想マシン

1つのCMSガベージコレクタの問題の有無

次のシナリオは極端ですが、それは頻繁に起こります。

面積はサバイバーを手放すていないため、マイナーGCの場合には、余分なオブジェクトは、古い時代に(プロモーション)を高めることができます。しかし、スペースデブリの中に今回の古いのは、並行モード障害エラーになります。今回は、Serailの旧ガベージコレクタとして収集するためにダウングレードする必要があります。これは、プロモーションは、同時モード故障の問題を失敗したよりも深刻です。

シンプル主なGCは、実際には、最長のフルGCへと進化することができます。最も恐ろしいが、この休止時間は予測不可能であるということです。

方法はあり、我々は最初の停止時間を定義することができ、次いで逆投影は、コンテンツを収集しますか?調べるために、それは廃棄物処理は毎回きれいにする必要はありません滴、G1のガベージコレクタがありますが、ちょうどそれが正しいと思った何をしようとしています。

私たちは、任意の1秒間のポーズで、G1を尋ねる目標にして、それを開発している10ミリ秒を超えてはなりません。G1は、コレクションがインクリメンタルに完了し、この一般的にマイナーコレクションの面積を算出することができる、この目標を達成しようとします。

-XX:MaxGCPauseMillis = 10これは一つの引数G1のガベージコレクタは、提供されなければなりません

2 G1のガベージコレクタは何ですか?

G1ガベージコレクタCMSは、ガベージコレクタの代わりに。

少し異なるヒープの分割にG1のガベージコレクタと他のガベージコレクタ。他のコレクタは、コレクション全体に悪い自然の時間制御に収集する十年です。G1ヒープが小さいターゲットとしてハンドルを取得、コピーの多くをカットし、目標の一部が到達するのは簡単です。

だから、G1は古いと若い世代がそれだ区別する必要がありますか?

ここに画像を挿入説明
示されるように、そこエデンGLとサバイバーゾーン領域の概念であるが、それらは、メモリ内の連続していないが、その小部分の小さな部分によって。

面積の小さい部分のサイズが固定され、名前は小さな山領域(地域)と呼ばれています。小さなヒープがエデンの領域であってもよい、また、サバイバー領域することができ、それはまた、旧地区することができます。だから、概念は論理的に若い世代とG1の古い時代です。

領域は、各ブロックは、サイズがその値は32Mに1M間の電力値は2バイトであり、同一です。

しかし、私のオブジェクトが大きすぎると、地域がどのように行うには合わないのですか?図は、黄色の面積の大きな領域があることに注意してくださいは、その名前は、50%以上のオブジェクトのサイズは、ここで割り当てられることになるよりも、作品Humongous地域、地域と呼ばれています。

それの小さな杭エンドゾーン内ので、回復時間、回復?何がランダムでありますか?これは確かではありません。実際には、小さなゴミ山のほとんどは、優先順位が収集されます。これは、原点G1(GarbageFirst GC)の名前です。

3 G1ガベージコレクションプロセス

論理的には、G1が古いと若い世代の分け、それは、若い世代の割合だと古いが、その「固定」ではない、指定されたMaxGCPauseMillisを達成するために、G1は自動的に2間の比率を調整します。

G1の回復プロセスは、主に3つのカテゴリーに分かれています。

  1. プロセスと同様のG1もマイナーGC呼ばれるガベージコレクションの「若い世代」、そして我々は前述の、発生のタイミングは、エデンエリアでフルタイムで
  2. 古い時代のガベージコレクション、実際には、厳密に言えば、コレクションではないが、それは「並行マーク」のプロセス、少しのオブジェクトをクリーンアップする方法です
  3. 実際のクリーンアップは、「混合モード」で開催された、それは、地域の意志も、クリーンアップの古い部分より明確な若い世代のアップです

RSET

RSETは、時間のための空間データ構造です。

私たちは、世代間の参照の問題を解決するために、と呼ばれるカードテーブル(CardTable)のデータ構造の前に言及しました。これに似たRSET機能は、それは完全な名前を記録するために使用し、リージョン間のオブジェクトの参照関係を維持し、RememberedSetあるのです。

しかし、カードの表にいくつかの異なった場所をRSET。カードの表には、ポイントアウト(私はオブジェクトを引用)構造です。(私のオブジェクトを引用)ポイント-への構造に属するオブジェクトのこの地域のオブジェクトの参照関係で他の地域記録RSET、転置インデックスの味。

あなたはRSETは、キー値は、ページのそのカードコレクションのオブジェクトへの参照で、リージョンアドレスへの参照で、ハッシュとして理解することができます。

このデータ構造、地域の回復を使用すると、オブジェクトのための全体のヒープメモリをスキャンする必要はありません。これは、可能な限り、コレクションの一部になります。

若い世代の地域の場合は、そのRSETは唯一の若い世代は、すべての若い世代のためのリージョンを回収されるので、それは、古い時代からの参照を保持している、ユリGILDする必要はありません。RSETの若い世代の地域だから空があるかもしれません。

地域の古いとしては、それはそれだけで、それは古いですへの参照を保持しますRSETです。古い回復する前に、若い世代のために最初に回収されるためです。この時、エデン面積が空で、リサイクルプロセスでサバイバーパーティションをスキャンしますので、参照から、若い世代を保存する必要はありません。

RSETは、通常5%以上については、多くのスペースを取ります。スペースだけでなく、計算のオーバーヘッドの多くは比較的大きいです。

具体的なリサイクルプロセス

G1はCSETの概念を持っています。そのフルネームはコレクションセット、ガベージコレクション(地域)の範囲を実行するために、収集したGCに保存されているコレクションです。GCは、転送されます内のすべての生存データ(ライブデータ)CSETです。

若い世代のリサイクル

リサイクルは、トレースにすべての地域外の若い世代のワンタイム・リカバリーSTWプロセスの若い世代、その世代間使用RSET参照データ構造です。

JVMが起動すると、G1は最初のエデン面積準備ができて、プログラムはエデンエリアへの実行時にオブジェクトを作成し続けエデンエリアの全てが一杯になったときに、G1は、若い世代のガベージコレクションプロセスいったん開始します。

若い世代のコレクションには、次の回復段階が含まれています。

  1. スキャンルート:我々はRSETレコードの他の外部参照領域と一緒に、以前のGCのルーツを説明したルートは、それを見ることができます
  2. アップデートRS:カードページで汚れたカードのキューを処理し、RSETを更新しました。このフェーズが完了すると、RSETは正確の古いメモリー・オブジェクト・セグメントが配置されているへの参照を反映することができます。これは、サプリメントの最初のステップとして見ることができます
  3. RSの処理:特定のオブジェクトの古いエデンエデン指すオブジェクト内のオブジェクトを指摘は、生存の対象であると考えられています
  4. オブジェクトをコピーする:はい、コレクションアルゴリズムは、まだコピーアルゴリズムを使用しています。この段階で、オブジェクト・ツリーは、ライブオブジェクトが中空領域サバイバー領域にコピーされたメモリセグメントエデン領域にトラバースされます。このプロセスは、対象者の年齢やプロモーションを含め、同じおよび他のガベージコレクションアルゴリズムであります
  5. ソフト、弱、ファントム、決勝、JNI弱いというように、処理の参照:参照を処理。コレクションの末尾
並行マーク

全体のヒープメモリの使用量は、(デフォルトは45%である)一定の割合に達すると、コンカレントマークフェーズが開始されます。InitiatingHeapOccupancyPercent構成:この比率はまた、パラメータ-XXによって調整することができます。

マーキング同時混在GCをマークするためにサービスを提供することであり、GCは、プロセスの一部であることを一度に一つではありません。特異的標識手順は次のとおりです。

  1. 初期ラベル:彼らはルートスキャン操作を多重化することができるので、このプロセスは、マイナーGCのポーズを共有しています。STWが、時間は、通常は非常に短いですが、
  2. ルートゾーンスキャン
  3. 並行マーク:スレッドとアプリケーションスレッドをマーキングこの段階マークヒープ内のオブジェクトの始まりは、GCの根から並行して実行し、様々なオブジェクトをリージョン生存情報を収集
  4. ラベルを変更:CMSと似ていますが、またSTW。コンカレントマークフェーズにおけるその変化は、オブジェクトマーキング
  5. クリーンアップフェーズ:このプロセスはSTWを必要としません。あなたは地域のゴミでいっぱいだった見つけた場合は、この段階で、それはすぐに削除されます。すべてではないごみ地域、そしてすぐに処理されません、それが混在GCの舞台になり、収集
SATB

コンカレントマークフェーズた場合は、新しいオブジェクトの変更があり、どのようにしますか?これは、アルゴリズムSATBによって保証されています。

SATB初めにスナップショットは、コンカレントマークフェーズの正確さを確保するために、その。
ここに画像を挿入説明
これはスナップショットであり、いくつかの主要なポインタロジック、地域が複数のセグメントに存在します。オブジェクトの割り当ては、並行マーク中に示されているように、次TAMSと頂部との間であろう。

回復混合(ミックスGC)

全体面積の小さなヒープにクリーンアップすることができます同時歳最適な状況があります。ミックス収集プロセス、若い世代をクリーンアップするだけでなく、地域の昔のもでCSETに追加の一部にするだけではなく。

並行マーキングフェーズでは、我々はゴミ古い時代の割合を数えています。それは割合が一定のしきい値に達したと判断された場合にマイナーGCた後、それは次の混在GCをトリガします。このしきい値は、-XX:設定(デフォルト5%ヒープサイズ)G1H​​eapWastePercentパラメータ。このような場合なので、GCは多くの時間が、めったに回復していないメモリを過ごすことになります。したがって、このパラメータはまた、混合GCの頻度を調整することができます。

その後G1MixedGCCountTargetは、コンカレントマークを制御するために、混合GCの数まで行われるパラメータがあります。

4 ZGC

G1可能性のある問題

システムはG1のガベージコレクタに切り替えられた後、GC深刻な問題が発生したラインは、非常に少ない予測モデルのG1とその革新的なパーティションスキームのおかげでてきました。予測モデルが失敗した時があるでしょう、我々が期待通りしかし、それは常にあなたがそれを要求してターゲットセットを与え、特に後に、そうは実行されません。

アプリケーションは非常にタイトなメモリであれば、回復の一部が十分ではなかった、常にヒープ全体を回復したいまた、メモリは、その後の作業はG1が少なく、他のガベージコレクタよりも、もあるため、アルゴリズム自体の複雑さではないでしょう行われますされますまた、任意の他のコレクタよりも悪いことができます。

ZGC機能

  1. 滞留時間は10ミリ秒を超えることはありません
  2. 滞留時間は、(ヒープにかかわらず、10ms以下に維持することができますどのくらいの)ヒープの増加に伴って増加しません
  3. これは、Mの数百人をサポートすることができ、さらにいくつかのTのヒープサイズ(最大サポート4T)

ZGCでは、古いものとさえ若い世代の論理も削除、1ページのみがブロックに分割され、各時間GCは、ページ圧縮操作になり、何の断片化の問題はありません。ZGCも意識NUMAアーキテクチャ、アクセス速度のメモリを向上させます。直接問題に伝統的なコレクションアルゴリズム、オブジェクトへZGC参照ポインタと比較して、オブジェクトの状態を識別するために、それは、64ビットマシン上で使用することができます。

ZGCは現在、オンラインで使用することはまだ非常に小さいです。でもして、それが唯一のLinuxプラットフォーム上で使用することができます。その人気を待って、それはいくつかの時間がかかります。

公開された134元の記事 ウォンの賞賛263 ・は 20000 +を見て

おすすめ

転載: blog.csdn.net/Geffin/article/details/104731478