「仮想マシンの詳細な理解」のガベージコレクションアルゴリズム

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

  • マークスイープ
    • リサイクルする必要があるオブジェクトをマークし、すべてのリサイクルされたオブジェクトのメモリ領域をクリアします
    • マーキングと削除のプロセスは効率的ではありません
    • 多くの不連続なメモリの断片化があり、大きなオブジェクトの割り当てには役立ちません(十分な連続メモリがない場合、別のガベージコレクションがトリガーされます)。
  • コピーを停止
    • 使用可能なメモリを2つのブロックに分割します。一度に1つのブロックのみが使用され、メモリが使い果たされると、ライブオブジェクトは定期的に別のメモリブロックに配置されます。
    • メモリ領域は通常のものであり、メモリを割り当てるためにポインタを移動するだけです。
    • 短所:メモリの半分が無駄になります。
  • マークコンパクト
    • リサイクルする必要があるオブジェクトをマークし、生きているオブジェクトをメモリの一方の端に移動して、境界の外側のメモリをクリアします
  • 世代別コレクション
    • 新世代のオブジェクトのほとんどは「死のため」であり、「コピー」アルゴリズムを使用して、ほんの一部が生き残ります
    • 古い世代では、オブジェクトの生存率が高く、割り当てが保証されないため、マーククリアまたはマークソート
  • HotSpotアルゴリズムの実装
    • ルートノードを列挙する
      • GCRootsでは、メモリのすべての領域をチェックするには時間がかかりすぎ、STWは一貫性を保証するために必要です。
      • したがって、正確なGCを保証し、オブジェクト参照が存在する場所を直接知る必要があります。
      • OopMapは、クラスの読み込みが完了すると、オブジェクトのオフセットに含まれるデータ型を計算し、JITジャストインタイムコンパイルでは、スタックとレジスタのどの位置が参照であるかを特定の位置に記録します。
    • 安全ポイント
      • 安全ポイントの選択
        • OopMapは命令ごとに生成されず、上記の特定の場所、つまり安全ポイントにのみ記録されます
        • プログラムの実行は、GCの安全なポイントに達したときにのみ停止します。
        • したがって、安全ポイントの選択は、「プログラムを長時間実行できる特性を持っているか」を基準とし、メソッド呼び出し、ループジャンプ、例外ジャンプなどの命令シーケンスの多重化が一般的です。
      • GCが停止したときにすべてのスレッドが最も近い安全なポイントに到達するようにする方法
        • プリエンプティブサスペンション
          • 未使用
          • すべてのスレッドを中断します。セーフポイントに到達していないスレッドがあるかどうかを確認してから、スレッドを再開し、セーフポイントまで実行します。
        • 自発的停止
          • 他のスレッドによってアクティブにポーリングされる割り込みフラグを設定します。割り込みフラグが真であることが判明した場合、それ自体に割り込みます。
          • ポーリングのタイミングは、オブジェクトの作成時にメモリを割り当てる必要があることに加えて、安全ポイントと一致します。
          • スレッドを中断する必要がある場合、仮想マシンはオフセットでメモリページを設定し、スレッドが

    • 安全なエリア
      • タイムスライスに割り当てられていないスレッドがGC割り込みに応答するようにする方法
      • 安全な領域とは、コードの一部において、参照関係が変化しないことを意味します。
      • 実施原則
        • スレッドがコードを安全な領域で実行すると、スレッドはそれ自体を識別して入ります。このプロセス中に、JVMはGCを開始し、セーフエリアに入るスレッドを無視します。
        • スレッドが安全領域を離れると、GCルート(またはGcプロセス全体)が完了したかどうかをチェックします。
        • 完了した場合は実行を続け、それ以外の場合は安全領域を離れる可能性のあるシグナルを待ちます。
元の記事24件を公開 賞賛された0 訪問数99

おすすめ

転載: blog.csdn.net/jiangxiayouyu/article/details/105614281