Java-virtual-machine-garbage-collection

提供:Dev Guides
移動先:案内検索

Java仮想マシン-ガベージコレクション

Javaオブジェクトのライフサイクルは、JVMによって管理されます。 プログラマがオブジェクトを作成したら、残りのライフサイクルについて心配する必要はありません。 JVMは、使用されなくなったオブジェクトを自動的に検出し、ヒープからメモリを回収します。

ガベージコレクションはJVMが行う主要な操作であり、ニーズに合わせてチューニングすると、アプリケーションのパフォーマンスが大幅に向上します。 最新のJVMによって提供されるガベージコレクションアルゴリズムにはさまざまなものがあります。 どのアルゴリズムを使用するかを決定するために、アプリケーションのニーズを認識する必要があります。

CやC ++などのGC以外の言語で実行できるように、Javaでプログラムでオブジェクトの割り当てを解除することはできません。 そのため、Javaでぶら下がり参照を使用することはできません。 ただし、null参照(JVMがオブジェクトを保存しないメモリ領域を参照する参照)がある場合があります。 null参照が使用されるたびに、JVMはNullPointerExceptionをスローします。

GCのおかげでJavaプログラムでメモリリークを見つけることはまれですが、実際に発生することに注意してください。 この章の最後でメモリリークを作成します。

次のGCは、最新のJVMで使用されます

  • シリアルコレクター
  • スループットコレクター
  • CMSコレクター
  • G1コレクター

上記の各アルゴリズムは同じタスクを実行します。使用されなくなったオブジェクトを検索し、ヒープで占有しているメモリを回収します。 これに対する単純なアプローチの1つは、各オブジェクトが持っている参照の数をカウントし、参照の数が0になったらすぐに解放することです(これは参照カウントとも呼ばれます)。 なぜこれがナイーブなのですか? 循環リンクリストを検討してください。 各ノードにはそれへの参照がありますが、オブジェクト全体はどこからも参照されていないため、理想的には解放する必要があります。

JVMはメモリを解放するだけでなく、小さなメモリチャックをより大きなメモリチャックに結合します。 これは、メモリの断片化を防ぐために行われます。

簡単なメモでは、典型的なGCアルゴリズムは次のアクティビティを行います-

  • 未使用のオブジェクトを見つける
  • ヒープで占有しているメモリを解放する
  • フラグメントの合体

GCは、実行中にアプリケーションスレッドを停止する必要があります。 これは、実行時にオブジェクトを移動させるため、これらのオブジェクトを使用できないためです。 このような停止は「世界の停止」と呼ばれ、GCの調整中にこれらの停止の頻度と期間を最小化することを目指しています。

メモリ結合

メモリ合体の簡単なデモを以下に示します

メモリ結合

網掛け部分は、解放する必要があるオブジェクトです。 すべてのスペースが再利用された後でも、最大サイズ= 75Kbのオブジェクトのみを割り当てることができます。 これは、以下に示すように200Kbの空き容量があった後でもです

影付き部分