Java仮想マシンの知識[GC]

まず、ガベージコレクションアルゴリズム

  1. マーク-スイープアルゴリズム
      最初のマークすべては、すべてのオブジェクトが均一なリサイクルをマークされている、オブジェクトを復元する必要があります。アルゴリズムの効率は高くないが、そこにあるメモリの断片化の問題が。

  2. レプリケーションアルゴリズム
      メモリこのメモリがなくなった場合、それはまだすべてのライブオブジェクトがメモリの別のブロックにコピーする唯一つのメモリ割り当てを使用して同じサイズの2つで割った容量、および使用されるメモリスペースは、一度離れてクリア。このアルゴリズムは、効率マーク明確なアルゴリズムの問題を解決することができます。しかし、半分のメモリ、より高い価格を分割する必要があるの。

  3. マークは-ソートアルゴリズムは、
      すべてのオブジェクトが回復する必要があるので、生きているオブジェクトは、端末境界の外側に直接メモリを一掃、一方の端部に向かって移動マークします。アルゴリズムは、メモリフラグメンテーションマークスイープアルゴリズムの問題、ならびに高い生存率でオブジェクトの複製アルゴリズムを解決することができ、複数の複製効率が低くなります。

  4. 以下のための世代コレクションアルゴリズム
      新世代、それぞれが少ししか生き残る死んだオブジェクトのガベージコレクションの数が多い、あなたはそう長く有料コピーがコレクションを完了するために、ライブオブジェクトの少量のコストとして、コピーアルゴリズムを使用する必要があり、
      古い時代、オブジェクト高い生存率は、余分なスペースは、あなたはクリーンアップのアルゴリズムを整理するためのマーカーまたはタグを使用する必要が彼を保証するために割り当てられていない。
      スペースをヒープになる世代のコレクションアルゴリズムが古いと陽の歳の若い世代に分けられ、若い世代には、ゾーンとエデンサバイバーに分割されていますエリア、サバイバー領域は、面積にしてから、ゾーンに分割されています。エデン領域とサバイバー領域の1部門:8によって既定。エデン領域は、連続したメモリ空間であるため、高速なエデンにメモリ領域を割り当てられました。衝突やTLABメモリ割り当てエデンエリアを短縮し、スレッドの安全性を保証するために、ポインタを使用してのHotSpot仮想マシン。
    世代別コレクションアルゴリズムのメモリ部門

実行フロー世代コレクションアルゴリズム

  1. エデン優先配分地域の新しいオブジェクト。
  2. エデン領域がいっぱいになると、それはマイナーGCをトリガーする、ライブオブジェクトがエデンSurvivor0に移動され、エデンはクリアされます。
  3. エデンエリアが再び一杯になるというように、クリアS0とS1スイッチの役割をし、次のラウンド、無限のようされているSurvivor1、S0とエデンにコピーされますで再びライブオブジェクトマイナーGC、エデンとSurvivor0を誘発します。
  4. 2つのサバイバー領域が複数回(のHotSpot仮想マシンのデフォルト15回)に切り替えた後、まだ生きているオブジェクトは、古い時代にコピーされます。

マイナーGC:GCの新世代の場所、マイナーGCは非常に頻繁に、通常は比較的速いスピードを回復するように、Javaオブジェクトは、オフプロパティChaoshengの夜持っているので。
GC主要/フルGCは:歳のGCに発生した、完全なGCは、多くの場合、(このような並列の清掃などの非絶対、)マイナーGCの少なくとも一方が付属して登場しました。フルGCの速度は10倍以上のマイナーGCよりも一般的に遅い、若い世代と古い時代の大きさを設定することが妥当であるフルGCの最小化するために操作を。

マイナーGCトリガ条件:
  • 火災エデンエリアがいっぱいです。
フルGCのトリガ条件:
  • System.gcを呼び出すときに、システムが完全GCの実装をお勧めしますが、必ずしも実装されません。
  • トリガー歳のスペースが不十分。
  • (永久/ドルのスペースの代わりに)メソッド領域は時にスペースの不足トリガされます。
  • 古い時代古い時代に入った後にマイナーGCによってトリガ連続したメモリの平均サイズは、利用可能なよりも大きいです。
  • 時間からエデンの領域は、スペーススペースゾーン領域にコピーするには、オブジェクト空間利用可能なメモリのサイズは、オブジェクト置くダンプ歳、古い時代とオブジェクトのトリガ時間未満利用できる連続したメモリサイズよりも大きくなっています。

第二に、メモリの割り当てと回復の戦略

  • エデンでの割り当て領域に優先順位をオブジェクト
      エデン領域が十分なメモリ空間が割り当てられていない場合、仮想マシンが起動します
    マイナーGCを。

  • ラージオブジェクトが、直接、古い年に
      、このような長い文字列や配列などの連続したメモリJavaオブジェクト、多数の古い時代に直接割り当てられますし、プログラムを書くときので避けるべきです。

  • オブジェクトの長期生存率は、古い年を入力します
      2つのサバイバーエリアはまだ生きているオブジェクトは、古い時代にコピーされ、数回(のHotSpot仮想マシンのデフォルト15回)に切り替えたとき。

  • 動的オブジェクトが決定された年齢
      と同じ年齢S0空間の全ての合計と同じか、被験者の年齢が直接しきい値に到達することなく、歳入力することができますよりも古い、オブジェクト空間S0の半分のサイズよりも大きい場合。

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

第三に、ガベージコレクタ

  1. シリアル:シングルスレッドコレクター。== ==複製アルゴリズム
  2. ParNew:マルチスレッド版のシリアルコレクタ。== ==複製アルゴリズム
  3. パラレルスカベンジ:類似ParNewコレクタを、他のコレクターはストップザ・ワールドに焦点を当てて、できるだけ多くの時間を短縮しますが、パラレルコレクタ方式の詳細については心配スループット、適応戦略をサポートしています。== ==複製アルゴリズム
  4. 旧シリアル:シリアル古いコレクターズエディション。== ==マーク照合アルゴリズム
  5. 旧パラレル:パラレルスカベンジコレクタのの古いバージョン。== ==マーク照合アルゴリズム
  6. CMS:並行マークスイープコレクターの一種である最短目標復旧時間を一時停止取得するコレクタを。== ==マークスイープアルゴリズム

 CMS処理の動作

  • 初期マーク(初期マーク):昔の生存内部のマークオブジェクトは、これらのオブジェクトは、GCの根からのものか、直接ポイント、またはオブジェクトの生存期間は、若い世代を指摘されています。これは、STW、最速につながります。

初期マーク

  • 並行マーク(並行マーク):ライブオブジェクトをマークし、全体の古い時代を行き来し始めの段階からすべてのルートを見つけます。しかし、減速、及びプログラムを並行して実行されます。

並行マーク

  • 改称(備考、最終):前の同時マーク、並行処理として、変更するアプリケーションの速度に追いつくことができないかもしれません。マーキング全体旧世代の生存オブジェクトの完了をマークするために再マークする必要があります。これは、高速、STWにつながります。
  • クリア同時(同時スイープ):死の同時明確なターゲット。しかし、減速、及びプログラムを並行して実行されます。

同時クリア

 CMS全体のプロセス

CMSコレクタ

 CMSの欠点

  • CPUリソースが非常に敏感です。デフォルトのスレッド数は、CMS(CPU数+ 3)/ 4に回収されます。
  • 无法处理浮动垃圾,可能出现“Concurrent Mode Failure”失败而导致另一次Full GC的产生。CMS并发清理阶段用户线程还在运行,伴随程序运行自然有新的垃圾不断产生,这部分垃圾出现在标记过程之后,CMS无法在当次收集中处理掉它们,只好留到下次GC再清理。这部分垃圾就是浮动垃圾。因为垃圾收集阶段的用户线程还要运行,所以CMS不像其他收集器那样等老年代几乎填满了在收集,会预留一部分空间。-XX:CMSInitiatingOccupancyFraction可以设置触发的百分比。当预留的内存无法满足程序需要,就会出现出现“Concurrent Mode Failure”失败,此时,虚拟机启动后备方案:临时启用Serial Old。
  • 标记-清除算法的缺陷。易产生内存碎片。解决方法:通过参数配置,用于CMS在Full GC 时开启内存碎片的合并整理过程,内存整理过程无法并发,会导致STW时间变长,因此有另一个参数配置,用于设置执行多少次不压缩的Full GC后,执行压缩会Full GC。

7.G1:面向服务端应用。

 G1 的特点

  • 并发与并行:充分利用多CPU、多核环境的硬件优势,缩短STW。
  • 分代收集:保留分代概念,能独立管理整个GC堆。
  • 空间整理:基于“标记-整理“,局部(两个Region)上看基于“复制”算法。所以不会产生内存空间碎片。
  • 可预知的停顿:这是G1相对于CMS的另一大优势,能让使用者明确指定一个长度为M毫秒的时间片段内,消耗在垃圾收集上的时间不得超过N毫秒。

 G1 的运作过程

  • 初始标记(Initial Mark):类似CMS
  • 并发标记(Concurrent Mark):类似CMS
  • 最终标记(Remark):类似CMS
  • フィルタ再生(cleanp):この段階でのオブジェクトが単一の領域に一つまたは複数の領域からコピーされ、調整および空きメモリれます。

8. ZGC:JDKの導入11は、制御着色ポインタを使用し、低遅延ガベージコレクタを有すると主張し、バリアローディング技術、STW、走査は、ガベージコレクション後に実現することができます。

第四に、ガベージコレクタの組み合わせ

パラメータ 機能
-XX:+ UseConcMarkSweepGCを + UseParNewGC:自動的に-XXを有効に
-XX:+ UseParallelGC + UseParallelOldGC:自動的に-XXを可能にしました。サーバーモードでのデフォルト。
-XX:+ UseParallelOldGC 自動的に-XXを有効に:+ UseParallelGC
-XX:+ UseParNewGC JDK8だけでは有効にすることはできません
-XX:+ UseSerialGC シリアル+シリアル古いです。クライアントモードのデフォルト。
-XX:+ UseG1GC G1ガベージコレクタを使用します

参考:「Java仮想マシン仕様(Java SEのバージョン8)」、「Java仮想マシン(第二版)の深い理解」GCアルゴリズム:実装

おすすめ

転載: www.cnblogs.com/bigshark/p/11246545.html
おすすめ