第6章 ガベージコレクション ガベージコレクション・アルゴリズム
この作品はAIを使って翻訳されている。ご意見、ご感想をお待ちしている:translation-feedback@oreilly.com
第5章は、すべてのGCアルゴリズムに普遍的に適用されるJVMフラグを含む、すべてのガベージコレクタの一般的な振る舞いを調べた:ヒープサイズ、世代サイズ、ロギングなどを選択する方法。ガベージコレクションの基本的なチューニングは、多くの状況で十分である。 そうでない場合、アプリケーションに対するGCの影響を最小限にするために、そのパラメータをどのように変更できるかを決定するために、使用中のGCアルゴリズムの特定の演算子を調べる時が来た。
個々のコレクタを調整するために必要な重要な情報は、そのコレクタが有効になっているときの GC ログからのデータである。この章では、ログ出力の観点から各アルゴリズムを見ることから始め、GC アルゴリズ ムがどのように動作し、より良く動作するためにどのように調整できるかを理解する。各セクションには、より良いパフォーマンスを達成するためのチューニング情報が含まれる。
この章では、いくつかの新しい実験的なコレクターの詳細もカバーする。 これらのコレクターは、この執筆時点では100%Solidではないかもしれないが、Javaの次のLTSバージョンがリリースされる頃には、おそらく本格的な、製品にふさわしいコレクターになるだろう(G1 GCが実験的なコレクターとして始まり、JDK 11のデフォルトになったように)。
非常に大きなオブジェクトの割り当て、短命でも長命でもないオブジェクトなどである。これらのケースはこの章の最後でカバーされる。
スループットコレクターを理解する
まず、スループット・コレクタから始めて、個々のガベージ・コレクタを見ていこう。G1 GCコレクタが一般的に好まれることは見てきたが、スループット・コレクタの詳細はより簡単で、物事がどのように動くかを理解するためのより良い基礎となる。
第5章から、ガベージコレクタは3つの基本的な操作を行わなければならないことを思い出してほしい:未使用のオブジェクトを発見し、そのメモリを解放し、ヒープをコンパクトにする。スループット・コレクターは、同じGCサイクルでこれらの演算子すべてを行う。、これらの演算子をまとめてコレクションと呼ぶ。これらの演算子は、1回の操作で若い世代か古い世代のどちらかを収集することができる。
図6-1は、ヤング・コレクションの前後のヒープを示す。
図6-1. スループットGCの若いコレクション
若いコレクションはエデンが一杯になったときに起こる。あるものは生存者スペース(このオブジェクト図ではS0)のひとつに移され、あるものはより多くのオブジェクトを含むようになった旧世代に移される。もちろん、多くのオブジェクトはもはや参照されないので廃棄される。
エデンは通常、この演算子の後には空っぽになっているため、圧縮されたと考えるのは異例に思えるかもしれないが、ここではそれが効果となっている。
JDK 8のGCログ(PrintGCDetails)では、スループット・コレクターのマイナーなGCが次のように表示される:
17.806: [GC (Allocation Failure) ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access