GCについて


ゴミ収集器について


ゴミ収集器はJVM実行エンジンの要素であり、ゴミを除去することができます.つまり、参照されないメモリです.JVMはhip領域のメモリを整理し、newなどの新しく生成されたオブジェクトから参照されなくなったオブジェクトをクリーンアップします.ごみ収集はメモリを整理するプロセスです.

ごみ収集プロセス


ごみ収集は、スタック領域のメモリをクリーンアップするプロセスであるため、メモリを停止した場合に行う必要があります.そこで、JVMはGCを行うために、まずアプリケーションの実行を停止するstop-the-worldを実行し、GCを実行するスレッドを除いて残りのスレッドは動作を停止する.

1)HeapはYoung世代とOld世代に分けられる.Young世代はEden/survival 0/Survival 1に細分化されている.
2)GCの作業は,Young領域に対するMinor GCとOld領域に対するMajor GCに分けられる.
3)Eden領域に新しいオブジェクトを作成し、Eden領域がいっぱいになるとMinor GCを生成し、参照関係がなければUnreachable Objectと判断し、eden領域がクリアされるとメモリが解放され、他の置換可能なオブジェクトはSubval 0に移動する.
4)既存のSurvival 0の取り消し可能なオブジェクトがSurvival 1に移動します.Survival 1が満たされている場合、移動可能オブジェクトはOld Generationにコピーされます.
5)Old領域が満たされ、Survivor領域からOld領域にアップグレードできない場合、Old領域に対するGC(Magjor GC)が実行される.
  • 参照関係
    1)Javaメソッドで実行される領域変数またはパラメータ参照
    2)静的変数による参照
    3)JNI生成オブジェクトへの参照
  • HeapとMetaspaceをJava 8から切り離す


    Java 8では、JVMはメモリ領域を永続的に生成するのではなく、metaspace領域を持つ.そして次のような変化が起こりました.(PermGenはクラスメタデータを含む領域であり、Heap領域に属し、サイズが限られている.)
    1)カテゴリ内のMeta情報->Metaspace領域へ
    2)メソッドのmeta情報に移動->metaspace領域
    3)Static Object->Heap領域に移動
    4)Stringオブジェクトの固定(String str="hello";)->Heap領域に移動
    5)クラスに関する配列オブジェクト情報->Metaspace領域へ
    6)Jvm内部オブジェクトと最適化コンパイラの最適化情報->Metaspace領域へ
  • ステータスオブジェクトの場合、メモリにロードされたクラスおよびクラスローダが終了すると、GCがないために永続的な生成に充満してメモリリークの問題が発生し、Heap領域に移行され、GCのターゲットに最大限変更される.
    ->Collectionオブジェクトを静的に実装して値を追加し続ける場合がありますが、perm領域がいっぱいになっているためoom...
  • static List<Object> list = new ArrayList<>();
  • は、変更を必要としない情報のみをMetaspace領域に格納するように改良され、MetaspaceはNative Memory領域であり、メモリ不足時にサイズを再調整することができる.
  • ごみ収集アルゴリズムのタイプ

  • Serial GC
    -mark-sweep-compactアルゴリズムを使用します.「Old」領域に生きているオブジェクト(Mark)を表示し、生きているオブジェクトのみを残す.(sweep)次に、前からオブジェクトを塗りつぶし、オブジェクトの存在と存在しないに分けます.(compaction)
  • Parallel GC
    -基本アルゴリズムはシリアルGCと同じですが、GCは複数のスレッドで処理されます.
  • Parallel Old GC (Parallel Compationg GC)
    −シリアルGCの代わりにsummaryアルゴリズムを使用するsweepアルゴリズム.要約フェーズでは,以前GCが実行されていた領域に対して個別の生体識別を行う.
  • Concurrent Mark & Sweep GC
    -intailタグステップでは、生きているオブジェクトを検索し(stop-the-world時間が短い)、見つかったオブジェクトをConcurrent(複数のスレッドが同時に表示される)に参照するConcurrentタグステップが実行されます.次にstop-the-worldを実行し、コメントを一致させます.stop-the-world時間を短縮し、アプリケーションの応答速度を速めるために使用します.
  • G1(Garbage First) GC
    -ボードの各領域にオブジェクトを割り当て、GCを実行します.既存のYoung/Old領域の概念を使用して、オブジェクトを割り当てます.
  • ごみ収集によるシステムの中断を減らすには


    1)オプション変更によるGC性能向上
  • 若い領域と古い領域の臀部の大きさを増加することによってGC周波数
  • を減少させる.
  • 割当および販促対象を減らす
  • 2)GC性能向上のための設定変更
  • アプリケーションはGCと並列
  • 3)コード変更によるGC性能向上
  • 不変オブジェクト
  • を使用
  • コレクションを使用するときに使用するオブジェクトサイズ(
  • )
    *参考資料
    https://code-factory.tistory.com/48
    https://velog.io/@hygoogi/%EC%9E%90%EB%B0%94-GC%EC%97%90-%EB%8C%80%ED%95%B4%EC%84%9C