JVMゴミ回収プロセス
1597 ワード
JVMゴミ回収のアルゴリズムは多いですが、どのアルゴリズムでもGCを行う際の大まかな流れはあまり悪くなく、主に以下の3つのプロセスがあります.
1.ルートノードの列挙
このプロセスでは、JVM仮想マシンスタックフレーム、定数プール内の静的オブジェクト、メソッド領域内の静的クラス属性参照、ローカルメソッドスタック内で参照されるオブジェクトで一般的に発生するすべてのGC Rootsオブジェクトが検出されます.このプロセスはSTWが発生し、すべてのスレッドが安全領域(Safe Region)に実行されてから実行されます.
通常、2つのアルゴリズムがあります.参照カウント法:各オブジェクトに参照カウンタを追加し、1つの場所が参照されるたびにカウンタ値は
利点は効率が高く、欠点はループリファレンスが処理できず、メモリがオーバーフローすることです.達性分析:GC Rootsをルートノードとし、これらのルートノードから下へ検索を開始し、検索したパスをリファレンスチェーン(Reference Chain)と呼び、1つのオブジェクトがリファレンスチェーンに接続されていない場合、このオブジェクトが使用できないことを証明します.
利点はすべてのオブジェクトを検出することができ、欠点は効率が低い.
GC Rootsノードは一般的に:仮想マシンスタック内のスタックフレーム参照オブジェクト ローカルメソッドスタックJNIにおけるスタックフレーム参照のオブジェクト 定数プールで参照するオブジェクト クラスの静的変数に適用されるオブジェクト 2.タグ
タグのプロセスは主にどのオブジェクトが回収される必要があるかをタグし、GCアルゴリズムが並列である場合もあれば、GC Rootsタグとともに実行される場合もある.パラレルであればSTWは発生しません.
コンカレントタグのGCアルゴリズムの場合、後に再タグまたは最終タグがあります.これは主に,同時タグの過程でユーザスレッドが実行され,その間に変化するオブジェクトがあることを解決するためである.
タグアルゴリズムには、次の2つがあります.タグ–消去アルゴリズムまたはタグ–整理アルゴリズム:オブジェクトごとにタグビットを格納し、オブジェクトの状態(生きているか死んでいるか) を記録するレプリケーションアルゴリズム:メモリを平均的に2つの部分に分割し、その一部のみを使用します.この部分がいっぱいになると、メモリ内の生存しているすべてのオブジェクトを別のメモリにコピーし、前のメモリで死亡したオブジェクトを空にします.
3.パージまたは回収
この段階ではGCアルゴリズムによって回収戦略が異なる. CMSアルゴリズムは回収時にストップ時間を考慮し,GCスレッドの占有時間をできるだけ少なくする . G 1アルゴリズムは、まず各Regionの回収価値とコストをソートし、ユーザが望むGC停止時間に基づいて回収計画 を策定する.タグ-パージアルゴリズムは、第2段階(パージ段階)において、オブジェクトを に回収する.複製アルゴリズムは、生存するオブジェクトを別のメモリ領域に複製することによって、現在の領域に複製されていないオブジェクトを消去する である.
1.ルートノードの列挙
このプロセスでは、JVM仮想マシンスタックフレーム、定数プール内の静的オブジェクト、メソッド領域内の静的クラス属性参照、ローカルメソッドスタック内で参照されるオブジェクトで一般的に発生するすべてのGC Rootsオブジェクトが検出されます.このプロセスはSTWが発生し、すべてのスレッドが安全領域(Safe Region)に実行されてから実行されます.
通常、2つのアルゴリズムがあります.
+1
になります.参照が無効になると、カウンタ値は-1
になります.いずれの時点でもカウンタが0
のオブジェクトは使用できません.利点は効率が高く、欠点はループリファレンスが処理できず、メモリがオーバーフローすることです.
利点はすべてのオブジェクトを検出することができ、欠点は効率が低い.
GC Rootsノードは一般的に:
タグのプロセスは主にどのオブジェクトが回収される必要があるかをタグし、GCアルゴリズムが並列である場合もあれば、GC Rootsタグとともに実行される場合もある.パラレルであればSTWは発生しません.
コンカレントタグのGCアルゴリズムの場合、後に再タグまたは最終タグがあります.これは主に,同時タグの過程でユーザスレッドが実行され,その間に変化するオブジェクトがあることを解決するためである.
タグアルゴリズムには、次の2つがあります.
3.パージまたは回収
この段階ではGCアルゴリズムによって回収戦略が異なる.