(5)Java GCアルゴリズムおよび種類

2943 ワード

GCアルゴリズムには主に以下の3つの方法がある(いずれもGC Rootsの達成性に基づいており、参照カウントアルゴリズムの実現は簡単であるが、循環参照の問題があるため、採用されていない.詳細はJava GC(概要)を参照)
(1).収集アルゴリズムのコピー
ヤングゾーンに対して、この領域のすべての到達可能オブジェクトを順次スキャンし(到達可能オブジェクトを決定する方法は、前節を参照)、スキャンはGCが維持する1枚のオブジェクト関係有向図(以下、到達可能オブジェクトチェーンと呼ぶ)のみをスキャンし、この図上であれば、このオブジェクトを別の領域にコピーする(このアルゴリズムを実現するには、Young領域と同じサイズの領域をスタックメモリに保持する必要がある)、元のEden領域オブジェクトは、From領域に移動し、From領域はTo領域に移動し、必要であれば、オブジェクトをOld領域(領域分割、Javaメモリ構造を参照)に移動し、元のメモリはすべて空になり、次のGCとして使用される.
メリットとデメリット:到達可能なオブジェクトを巡回するだけで、到達不可能なオブジェクトにアクセスする必要はありません.巡回は少ないですが、大きなレプリケーションコストとメモリが必要です.
(2).タグクリアアルゴリズム
可達オブジェクトチェーンを巡回し、これらのオブジェクトをマーキングします.次に、領域全体のオブジェクトを巡回し、マーキングのクリアはありません.
メリットとデメリット:余分なスペースは必要ありませんが、遍歴にかかるスペースが大きく、メモリの破片が大量に発生します.
(3).タグ整理アルゴリズム
前の2つの結合は、オブジェクトチェーンを巡回し、これらのオブジェクトをマークし、これらのオブジェクトを順番に1つのメモリに結合します.例えば、1、2、3、4、5、6、7、8つの連続メモリオブジェクトがあります.そのうち、2、5、8はチェーン上のオブジェクトに達します.マーク整理アルゴリズムの方法は、まず彼らをマークし、1から巡回します.1いいえ、2、2までです.2を1、2タグクリアにコピーし、3、4、いいえ、5、はい、5を2にコピーします.このようにして、最後に1、2、3の有用なメモリが得られ、後のメモリがクリアされます.
メリットとデメリット:タグクリアに比べてメモリの破片はありませんが、遍歴にかかる費用は依然として大きいです.
実際、GCは、スタックメモリの領域によって異なるアルゴリズムで回収されます.
Young区:生存する対象は少なく、複製の代価は小さいが、回数が多く、複製収集アルゴリズムを採用している.
Old領域とメソッド領域:オブジェクトの生存が多く、回数が少なく、遅く、タグクリアまたはタグ整理アルゴリズムを採用する.
以上,GCの具体的なアルゴリズム,すなわちメモリを回収する手法であり,GC回収器の種類実装にも多くの種類がある.
更に各種GC回収器を説明する前に、まずGC回収器の測定指標を説明する.
1.Throughput(スループット):GCの実行に費やされていないすべての時間が総実行時間に占める割合.
2.Pauses(一時停止):GCが実行されているときのプログラムの一時停止回数.または、興味のある一時停止回数のうち、一時停止の平均時間長と最大時間長.
3.Footprint(足跡?):現在使用されているヒープメモリサイズ(アルゴリズムにかかる余分なスペース).
4.Promptness(タイムリー):使用されなくなったオブジェクトがどのくらいメモリを消去して解放されるか.
(1).シリアルごみ回収器
GCスレッドは1つのみで、すべての作業スレッドを一時停止し、1つのメモリ領域を収集し、サーバ環境に適していません.シリアルゴミ回収機は、JVMコマンド-XX :+UseSerialGCで使用できます.シリアル回収器にも2種類あります:1.Serial:新生代のみ使用;2.Serial Old:古い世代にしか使われていないアルゴリズムが違う(一般的にCMSの代役として)
(2).パラレルごみ回収器
GCはマルチスレッドを用いてゴミ回収を行っている.JVMコマンド-XX:+UseParallGCでパラレルゴミ回収機を使用できます.並列回収器は3種類ある:1.ParNewは、新生代に作用します.2.Parallel Scavengeは新生代に作用するが、スループットが主である.3.Parallel Oldは、古い年代に作用し、スループットも主で、2に合わせて使用されています.
(3).同時タグスキャンゴミ回収器(CMS)
マルチスレッド、タグクリーンアップ(Full GCの場合)はJVMコマンド-XX:+UseConcMarkSweepGCで使用され、主に古い世代に使用され、ポリシーは:
高齢者世代は2回の短い停止しかなく、他の時間アプリケーションは収集スレッドと同時に消去されます.タグ整理アルゴリズムの長い一時停止の代わりに、2回の短い停止を採用し、その収集サイクル:
初期フラグ(CMS-initial-mark)->同時フラグ(CMS-concurrent-mark)->再フラグ(CMS-remark)->同時クリア(CMS-concurrent-sweep)->同時リセット状態は、次回のCMSのトリガ(CMS-concurrent-reset)を待つ.
その主な適合シーンは、応答時間の重要性に対する要求がスループットに対する要求よりも大きく、ゴミ回収スレッドとアプリケーションスレッドがプロセッサリソースを共有し、アプリケーションに比較的多くの長寿命周期のオブジェクトが存在するアプリケーションである.しかし、CMS収集アルゴリズムは最も時間のかかるメモリ領域でマルチスレッド同時操作を採用しており、サーバCPU資源が不足している場合、実際には性能が向上せず、かえってシステムスループットの低下を招く.
(4).G 1ゴミ回収器
スタックメモリが大きい場合に適しており、メモリを異なる領域に分割し、同時に回収し、回収後に残りのメモリを圧縮し、タグを整理し、サーバ側に適用します.
GCごみ回収に関する詳細な良質なブログを発見しました.参考:JVMチューニングとごみ回収器の説明(zhuangyalei)