Java JVM:ゴミ回収(GCはいつ、何に対して、何をしたのか)

3128 ワード

いつ:
まず、GCはminor GCとFull GC(major GC)に分かれています.Javaスタックメモリは新生代と旧年代、新生代に分かれています.
には、1つのeden領域と2つのSurvior領域があります.
一般的に、新しく作成されたオブジェクトはeden領域に割り当てられ、これらのオブジェクトはminor gcを通過しても生存し、移動されます.
Surviorエリアでは、オブジェクトがSurviorの中でMinor GCを1つも耐えられず、年齢が1歳増加し、彼の年齢がある程度に達すると、
古い時代に移動されます
eden領域が満たされると、生存しているオブジェクトはsurvior領域にコピーされ、1つのsurvior領域が満たされると、この領域の生存オブジェクトは別の領域にコピーされます.
surviorエリアは、もう一つがいっぱいになったときに、前のSurviorエリアからコピーされ、この時点で生きているオブジェクトが、古い年代にコピーされる可能性があります.
若い世代の対象は基本的に朝生夕死(80%以上)であるため、若い世代のゴミ回収アルゴリズムは複製アルゴリズムを用いており、
レプリケーションアルゴリズムの基本的な考え方は、メモリを2つに分け、その1つだけが使用されるたびに、このメモリが使用されると、まだ生きているオブジェクトを
もう一つの上.レプリケーション・アルゴリズムでは、メモリ・フラグメントは生成されません.
GCが開始されると、オブジェクトはedenゾーンのみに存在し、「From」というSurviorゾーンと、Surviorゾーン「to」は空になります.続いてGC
eden領域で生存しているすべてのオブジェクトは「To」にコピーされ、from領域では生存しているオブジェクトは彼らの年齢値に基づいて行方を決定します.
年齢が一定に達したオブジェクトは古い年代にコピーされ、到着しなかったオブジェクトはto surviorにコピーされ、今回のgcを経てeden区とfrom
surviorエリアはすでに空になっています.この時、fromとtoは彼らの役を交換します.つまり、新しいtoは前回GC前のfromです.
Minor GC:若い世代からメモリを回収
jvmが新しいオブジェクトにスペースを割り当てることができない場合、例えばEden領域がいっぱいになった場合、Minor GCがトリガーされます.
メモリプールが満たされると、その内容はすべてコピーされ、ポインタは0から空きメモリを追跡します.EdenとSurvior領域にメモリフラグメントは存在しません
書き込みポインタは、使用するメモリプールの上部に常に留まっています.minor操作を実行すると永続世代に影響を及ぼさず、永続から若い世代への参照は
GC rootsでは、若い世代から永続的な世代への参照は、タグフェーズで直接無視されます(javaのクラス情報を格納するために永続的な世代が使用されます).eden領域の大部分が
オブジェクトはゴミとみなされ、Surviorエリアや古い年代の空間にはコピーされません.正反対であれば、eden領域のほとんどの新生オブジェクトはGCに合致しない
条件として,Minor GC実行時に一時停止するスレッド時間が多くなる.Minor may call “stop the world”;
Full GC:若い世代と古い世代を含むスタック空間全体を整理します.
では、Minor GCのトリガ条件:ほとんどの場合、eden領域で直接割り当てられます.eden領域に十分な空間がなければ
ミノルGCを開始しますFullGCのトリガ条件:古い年代に十分なスペースがなければ、FullGCを1回行います.
MinorGCが発生する前に、仮想機会は、古い世代で最も利用可能な連続空間が新生代のすべてのオブジェクトの総空間よりも大きいかどうかを確認します.
より大きい場合はMinor GC、より小さい場合はHandlePromotionFailure設定が保証の許可に失敗したかどうかを見ます(許可されていない場合は直接FullGC)
許可されている場合は、古い年代の最大利用可能な連続空間が、古い年代に昇進したオブジェクトの平均サイズよりも大きいかどうかを確認し続けます.
試行minor gc(試行に失敗した場合もFull GCがトリガーされます)、より小さい場合はFull GCが行われます.
しかし,具体的にいつ実行されるかは,システムによって決定され,予測できない.
何に対して:
主に達成性分析アルゴリズムに基づいて、1つのオブジェクトが達成できない場合は回収でき、1つのオブジェクトが達成できる場合は、このオブジェクトは回収できません.
可達性解析アルゴリズムでは、「GC Roots」と呼ばれる一連のオブジェクトの最も開始点を通過し、オブジェクトGC Rootsに参照チェーンが接続されていない場合、
では、この対象は達成できないので、回収することができます.
何をしましたか.
主にオブジェクトを整理し、メモリを整理する仕事をしました.Javaスタックは新生代と旧年代に分けられ,異なる回収方式を採用している.
例えば新生代は複製アルゴリズムを採用し,旧世代はマーキング整理法を採用した.新生代では1つのede領域と2つのSurviorに分かれています
エリアは、本当に1つのedenエリアと1つのSurviorエリア、GCを使用すると、生きているオブジェクトが別のSurviorエリアに入れられ、
そしてこのeden領域とSurvior領域をクリアします.では、古い時代にはマーク整理髪を採用し、まず生存対象をマークし、
そして一段移動しています.これにより、メモリの破片を減らすことができます.
タグ:タグのプロセスは、実際には、すべてのgc rootを巡って、すべてのgc rootが達成できるオブジェクトを生存オブジェクトとしてタグ付けします.
≪パージ|Purge|ldap≫:パージ中にスタック内のすべてのオブジェクトを巡回し、マークされていないオブジェクトをすべてパージします.
主な欠点:タグとパージの効率が高くなく、タグのパージ後に大量の不連続なメモリフラグメントが発生する
しかし,旧世代ではオブジェクトの生存率が高いため,彼に保証を割り当てる余分な空間がなく,タグ整理アルゴリズムを用いなければならなかった.
タグ整理アルゴリズムタグ操作は「タグ-クリア」アルゴリズムと一致し、その後の操作は直接オブジェクトをクリーンアップするだけでなく、クリーンアップする
不要なオブジェクトが完了したら、生存しているすべてのオブジェクトをセグメントに移動させ、参照オブジェクトのポインタを更新します.
主な欠点:タグのクリアに加えてオブジェクトの移動も必要で、コストが比較的高く、コストが比較的高く、メモリの破片が発生しないメリットがあります.