シェナンドーガベージコレクタは、Red Hatを達成することである、2014年にはJVM低一時停止のメモリのニーズに合わせて回復するように設計ガベージコレクタの研究プロジェクトPauseless GCを、発表しました。この設計は、アプリケーションスレッドを同時に実行のガベージコレクタスレッドはJavaスレッドで圧縮ヒープことができるように、滞留時間を改善するために、CPU同時サイクルとスペースを交換することによって、時間を実行して、マーク及び仕上げは、このように大を回避、同時に行うことができますほとんどのJVMのガベージコレクタの問題が発生しました。
シェナンドアGC主な目標は、独立懸架10msの、懸濁ヒープサイズの99.9%未満です。
ごみの分類の投資回収期間:
- スレッドの数で割った、ガベージコレクタは、シリアルおよびパラレルガベージコレクタに分割することができます。
- シリアル回復期間は同じことを意味し、CPUが複数利用可能である場合、単純な用語を生じる唯一CPU
ウェルガベージコレクションガベージコレクション操作を実行するため、および場合、作業が完了すると、プログラムのワーカースレッドは、ガベージコレクションを停止します
シリアル・リカバリで中断ワーカースレッドを再開します前に。 - 代わりに、リサイクルやシリアル、パラレルコレクションは、複数のCPUのガベージコレクションを使用して同時に行うことができるので、アプリケーションのスループットを向上させるが、パラレルバック
利益は同じシリアルリサイクル、排他的に使用、「ストップ・ワールド」を使用したままメカニズムとレプリケーションのアルゴリズム。
- シリアル回復期間は同じことを意味し、CPUが複数利用可能である場合、単純な用語を生じる唯一CPU
- 動作モードに応じてポイントが同時回復と排他的ガベージコレクタに分けることができます。
- コンカレントガベージコレクタスレッドが交互にできるだけアプリケーションの滞留時間を短縮するために、アプリケーションと連携します。
- 独占ガベージコレクタ(世界の停止)を1回実行しているガベージコレクションプロセスが完全になるまで、アプリケーション内の他のすべてのスレッドを停止する
完全なエンド。
- プロセスは、圧縮および非圧縮ガベージコレクタガベージコレクタによって個片に分割することができます。
- 圧縮ガベージコレクタ復旧が完了した後、生きているオブジェクトは、整理回収した後、破片を除去圧縮されています。
- ガベージコレクタの非圧縮タイプは、この操作を実行しません。
- 仕事のメモリ範囲を押すに分けることができる若い世代のガベージコレクタと古いのガベージコレクタ。
GCの性能を評価する方法
- スループット:プログラムの実行時間が(プログラムメモリ+回復時間の時間を実行しています)。
- ガベージコレクションのオーバーヘッド:スループット補体、時間および総時間のガベージコレクタの割合。
- 時間を一時停止:ガベージコレクション、スレッドの作業プログラムが中断された時間を。
- コレクションの頻度:アプリケーションの実行、コレクションの発生の動作周波数に関して。
- ヒープスペース:メモリサイズによって占められたJavaヒープ領域。
- クイック:オブジェクトの回復時間は、生まれてからに経験されます。
シェナンドーGCは動作します:
そのメモリ構造はG1に非常に類似して、領域のチェッカーボードに分割されたメモリと同様です。G1と、全体のプロセスは比較的類似しているが、最大の違いは、GCへの同時避難(避難)リンク、BrooksForwardingポインタ技術の実現には、オブジェクトを移動すると、オブジェクト参照がまだアクセスすることができますされています。
初期マークコンカレントマークフェーズが開始:
- 並行マークヒープトラバーサル段階
- 並行マーク完了段階
- 不活動、地域段階の同時整理回収
- メモリの統合フェーズの同時避難エリア
- INITアップデート参考文献更新参照の初期化フェーズ
- 基準位相同時更新
- 最終更新参考文献の完全なリファレンス更新フェーズ
- いいえ同時回復位相基準エリアありません
シェナンドーのJVMパラメータを設定したり、デバッグ:
- -XX:+ AlwaysPreTouch:実行時のパフォーマンスの低下を避けるために、システム動作の一時停止を減らす、すべての利用可能なメモリのページングを使用します。
- -Xmx == -Xmsv:初期ヒープサイズが最大値と一致して設定し、ヒープサイズを延伸することによって発生する応力を低減することができ、AlwaysPreTouchと組み合わせて使用されるパラメータは、最終的な使用中のシステムのダウンタイムを回避するために、起動時にすべてのメモリを提出します。
- -XX:+ UseTransparentHugePagesは:大幅山のパフォーマンスを向上させるが、Linux上で使用する場合ことをお勧めすることができます
有効/ / SYS /カーネル/ MM / transparent_hugepageと/ SYS /カーネル/ MM / transparent_hugepage / defragv に:のmadviseと同時に、 AlwaysPreTouch、initで使用し、それが大きなページの前処理を使用しているため、より高速shutdownvとき。 - -XX:+ UseNUMA:ありませんが、NUMA(不均等メモリアクセス)のための明確なサポートはまだシェナンドーが 、 それはこの機能を有効にするために最善である
マルチスロットメインフレーム上のNUMAずらしを有効にすることができます。AlwaysPreTouchと組み合わせることで、それがデフォルトの設定よりも優れたパフォーマンスを提供します。 - -XX:+ DisableExplicitGC:にSystem.gcコード()の呼び出しを無視します。ユーザーがコード軍ににSystem.gc()を呼び出すと
シェナンドーはSTWのフルGCを実行し、それを使用することも可能で、この操作の実行を防ぐために無効にする必要があります- - XX:代わりに全GCの+ ExplicitGCInvokesConcurrent、CMS GCの実装にSystem.gc()を呼び出すと、推奨している
場合は、System.gc()の呼び出しの使用を。
しかし、今シェナンドーのガベージコレクタはまた、シェナンドーGCをコンパイルする必要がありますを使用したい場合はパラメータを使用して、--with-jvmfeatures shenandoahgcオプションを使用して、実験的なプロジェクトとして標識し、その後、開始されました - -XX:+ UnlockExperimentalVMOptions -XX:+ UseShenandoahGC