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

この章では、JVM内で行われるガベージコレクションについて基本的な事柄を紹介します。Javaアプリケーションのパフォーマンスを改善するためには、ガベージコレクターのチューニングはコードの書きなおしに次いで効果的です。

現在のJVMでは、シリアル型(単一CPUのマシンで使われます)、スループット(パラレル)型、CMSそしてG1という4種のガベージコレクターを主に利用できます。CMSとG1はコンカレント型とも呼ばれます。詳細については次の章で解説しますが、それぞれのパフォーマンスは大きく異なります。この章では、それぞれのガベージコレクターの基本的なしくみや共通点について紹介します。

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

Java言語の最も魅力的な特徴の1つに、開発者がオブジェクトのライフサイクルを管理しなくてもよいという点があります。オブジェクトは必要な時に生成され、必要なくなればJVMによって自動的に解放されます。もし皆さんが筆者のように、Javaプログラムでのメモリの利用の最適化に多くの時間を費やしているなら、このようなしくみは便利ではなくむしろ弱点と考えるかもしれません。筆者がガベージコレクションの解説に費やした時間の長さからも、この考え方は裏づけられるでしょう。物事にはよい面と悪い面があるものです。しかし筆者はかつて10年の間、他の言語を扱う仕事に就いていました。そこでダングリングポインタやヌルポインタにまつわるバグと格闘した時間よりも、今までの15年間にJavaでのメモリの問題に取り組んだ時間は短いでしょう。

ガベージコレクションとは基本的に、使われなくなったオブジェクトを探すこととそのオブジェクトに関連づけられたメモリを解放することで成り立っています。JVMはまず、使われないオブジェクト(ガベージオブジェクト)を探します。それぞれのオブジェクトを参照している箇所の数がカウントされ、どこからも参照されずこのカウントがゼロになったオブジェクトがガベージコレクションの対象になります。ただし、単純に参照の数を数えるだけでは不十分です。例えばリンクリストでは、リスト中の各オブジェクト(先頭は除く)は別のオブジェクトから参照されています。しかし先頭のオブジェクトがどこからも参照されていないとしたら、リスト全体が使われていないということになり解放が可能です。また、環状リスト(末尾のオブジェクトが先頭のオブジェクトを参照する)ではすべてのオブジェクトが参照されています。ここでも、リスト自体が参照されていないならその中のオブジェクトは使われていないとみなせます。 ...

Get Javaパフォーマンス now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.