ガベージ コレクション - 世代別コレクション

世代別ガベージ コレクション

「ガベージ コレクション アルゴリズム」では 3 つのガベージ コレクション アルゴリズムが紹介されていますが、実際の JVM 仮想マシンは、特定のアルゴリズムを単独で使用するのではなく、前の 3 つのアルゴリズムを組み合わせて連携して動作させる特定の実装が仮想マシン内で呼び出されます。ヒープメモリの全領域を2つの部分に分割する世代別ガベージコレクションメカニズム。1つは新世代と呼ばれ、もう1つは旧世代と呼ばれます。新しい世代は、さらにエデンの園、サバイバル エリア フロム、サバイバル エリア ト​​ゥに分けられます。

なぜこのような地域区分を行うのでしょうか。その主な理由は、Java には長期間使用する必要のあるオブジェクトがあり、長期間使用されたオブジェクトは古い世代に配置され、使用後に破棄できるオブジェクトは新しい世代に配置されます。 . ライフ サイクルのさまざまな特性によって、さまざまなガベージ コレクション戦略が実行されます。古い世代のガベージ コレクションは長期間に 1 回しか発生しませんが、新しい世代のガベージ コレクションはより頻繁に発生します. 新しい世代は死にかけているオブジェクトを扱います.長い間。このように、領域ごとに異なるアルゴリズムを使用すると、ガベージ コレクションをより効果的に管理できます。

新しいオブジェクトを作成すると、新しいオブジェクトはデフォルトでエデンの園のスペースを使用します。その後、多くのオブジェクトが作成されてエデンの園に配置される可能性があり、エデンの園の空きスペースは徐々に減少します。オブジェクトが作成され、エデンの園で見つかった場合 十分なスペースがない場合、ガベージ コレクションがトリガーされます。これは、新世代のガベージ コレクション (マイナー GC) にあります。マイナー GC がトリガーされた後、前述の到達可能性分析アルゴリズムを使用して GC ルート参照チェーンに沿って検索し、エデンの園のオブジェクトが有用か不要かを確認し、それらにマークを付けます。マークが成功すると、コピー アルゴリズムを使用して、生き残ったオブジェクトをサバイバル エリア To にコピーします。サバイバル エリア TO にコピーした後、生き残ったオブジェクトのライフは 1 増加し、ガーデンに残っているオブジェクトはof Eden を完全にリサイクルしてから、サバイバル エリア From とサバイバル エリア To を交換します。これまでのところ、最初のガベージ コレクションは完了しており、この時点で Eden には十分なスペースがあり、引き続きオブジェクトを次の場所に割り当てることができます。エデン。

一定期間後、Eden のスペースが再びいっぱいになり、2 番目のガベージ コレクションがトリガーされます.このガベージ コレクションは、Eden で生き残ったオブジェクトを見つけるだけでなく、生き残り続ける必要があるかどうかも調べる必要があります。生き残ったエリア オブジェクト。次に、エデンの園の生存オブジェクトを生存エリア TO に置き、寿命を 1 増やします。さらに、生存エリア From の生存オブジェクトを生存エリア To に置き、以前の寿命に 1 を加えます。その後、エデンを解放し、サバイバーエリアからゴミを片付けます。次に、From と To を交換すると、エデンの園に十分なスペースができ、2 回目のガベージ コレクションが完了します。

サバイバル エリア内のオブジェクトは、サバイバル エリアに永遠にとどまるわけではありません. たとえば、その寿命がしきい値を超えると、たとえば、デフォルトのしきい値は 15 です。オブジェクトの値は比較的高く、頻繁に使用されるため、オブジェクトが将来ガベージ コレクションによって回収されることはないため、サバイバー領域に保持する必要はありません。このとき、オブジェクトは次のように昇格されます。古い世代のガベージ コレクションの頻度は比較的低く、簡単には再利用されません。これがマイナー GC ガベージ コレクションのプロセスです。

継続的なリサイクル プロセス中に、古い世代のメモリ領域がいっぱいで、新しい世代の領域もいっぱいに見える場合があります.このとき、マイナー GC は問題を解決できません.このとき、フル GC が必要です. . 通常、これらのガベージ リサイクルは、スペースに十分なメモリがない場合にのみトリガーされます。Full GC の意味は、古い世代の領域が不足している場合に全体的なクリーンアップを行うことであり、新しい世代から古い世代まで、ヒープ全体がクリーンアップされます。

要約する

  • オブジェクトは最初に Eden 領域に割り当てられます。
  • 新世代では容量不足、Minor GCが発動、CopyでEdenとFromの生き残りオブジェクトをTOにコピー、生き残りオブジェクトのageを1つ増やしてfrom toを交換
  • マイナー GC は Stop the world を引き起こします (ガベージ コレクション アルゴリズムを実行すると、Java アプリケーションの他のすべてのスレッドが中断されます (ガベージ コレクション ヘルパーを除く))。他のユーザーのスレッドを中断する理由は、ガベージ内のプロセスリサイクルにはオブジェクトのコピー、つまりオブジェクトアドレスの変更が含まれます. この場合、複数のスレッドが同時に実行されていると混乱が生じます. オブジェクトが移動され、他のスレッドがこのオブジェクトに再度アクセスします. . オリジナルによると、アドレスはこのオブジェクトを見つけることができないため、STW がトリガーされます。他のユーザー スレッドを中断し、ガベージ コレクションが完了するまで待ってから、ユーザー スレッドを続行します。
  • オブジェクトの寿命が閾値を超えると旧世代に昇格し、最大寿命は15倍(4bit)です。
  • 古い世代に十分なスペースがない場合、最初にマイナー GC をトリガーしようとし、将来まだ十分なスペースがない場合は、フル GC をトリガーします。FULL GC でも STW が発生しますが、古い世代に対応する STW 時間は長くなります。

おすすめ

転載: blog.csdn.net/qq_35363507/article/details/104930159