2019年5月15日

第5章 ガベージコレクションの基礎

ガベージコレクションの概要

Java言語の最も魅力的な特徴の1つに、開発者がオブジェクトのライフサイクルを管理しなくてもよいという点があります。ガベージコレクションとは基本的に、使われなくなったオブジェクトを探すこととそのオブジェクトに関連づけられたメモリを解放することで成り立っています。 メモリの断片化を防ぐために、不使用のメモリを解放して、メモリを領域を結合します。 簡単に言うと、ガベージコレクションのパフォーマンスは未使用のオブジェクトの発見とメモリの解放そしてヒープのコンパクト化という3つの要因によって決まります。

すべてのガベージコレクターは基本的に、オブジェクトを複数の領域に分類して管理し、それぞれのために別のヒープ領域を用意しています。これらの領域は、old(または、終身在職を意味するtenured)領域そしてyoung領域と呼ばれます。young領域はさらに、edenとsurvivorという2つの空間に分けられます。

利用するガベージコレクターの判断基準

どのガベージコレクターを利用するべきか判断する際には、全体としてパフォーマンスの目標を定めるとよいでしょう。

個々のリクエストに対するレスポンスタイムが重要な場合では、次のような点について検討が必要です。

バッチ処理型のアプリケーションでは、次のようなトレードオフを考慮しながらガベージコレクターを選択してください。

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

シリアル型ガベージコレクター

クライアントマシンのマシンでは、これがデフォルトのガベージコレクターになります。ヒープの処理を行うスレッドは1つです。マイナーガベージコレクションとフルガベージコレクションの両方で、アプリケーションスレッドをすべて停止した上で処理が行われます。

スループット型ガベージコレクター

サーバークラスのマシンでは、これがデフォルトのガベージコレクターになります。young領域の処理に複数のスレッドを利用します。したがって、マイナーガベージコレクションはシリアル型よりも大幅に高速です。また、old領域の処理に複数のスレッドを利用することもでき、Java 7u4以降ではこれがデフォルトの設定になっています。 ここでも、マイナーガベージコレクションとフルガベージコレクションの双方でアプリケーションスレッドはすべて停止します。

CMSガベージコレクター

Powered by Fruition