前回は「Javaヒープの動作」をご紹介しましたが、今回は続編としてJavaヒープのクリーンナップを自動的に行ってくれるガベージコレクションの動作について紹介したいと思います。各クラウドソリューションを使用したシステムの運用管理においては、ヒープ管理によるリソースの管理に加えて、ガベージコレクションの管理も必要です。適切な設定を施さないと、不必要にスケールアウト/スケールアップを行うことになりかねません…。
ガベージコレクションって?
まずは今回のスコープを決定することから始めましょう。 ガベージコレクション(GC)とは、Javaヒープ上に存在する未使用のオブジェクトを解放してくれる機能 です。この存在のおかげで開発者はリソースの管理から解放され、本来実装すべき機能要求の実装に注力できるという恩恵を得ることができます。
ただ、ガベージコレクションの存在は、JVM仕様において定義されているものの、そのアルゴリズムや実装方法は多種多様であり、数多のJVMベンダ間で、また同じベンダ内においてもバージョンによって動作やオプションに相違があります。
今回は HotSpot VM におけるガベージコレクションの種類 をご紹介してみたいと思います。
ガベージコレクションの種類
多くのJVM実装におけるヒープの管理については、多くのベンダが 世代別管理 を行っており、Young世代においては動作コストの小さいマイナーGCを、Old世代においては動作コストの大きいメジャーGCを動かすことで、ヒープ内の不要なオブジェクトを回収しています。
世代別管理については、詳しくは前回のコラムをご覧ください。
Javaの動作原理を知ろう① -ヒープ編-
各GCはJavaスレッドとして動作しますが、それぞれの 動作アルゴリズム を 実行時のオプション指定で変更することが可能 です。
今回検証した環境(CentOS 7.3、JDK1.8.0_111)において有効な主要なアルゴリズム は以下のとおりです。
- シリアルコレクタ (-XX:+UseSerialGC)
- パラレルコレクタ (-XX:+UseParallelGC)
- コンカレントコレクタ (-XX:+UseConcMarkSweepGC)
- ガベージファースト・ガベージコレクタ:G1GC (-XX:+UseG1GC)
上記のアルゴリズムは今回取り上げているHotSpot VMにおいて有効なもののため、お使いのJVM環境において有効なアルゴリズムは別途ご確認ください。
また、システムにおけるガベージコレクションの動作チューニングの手間を抑えるため、ガベージコレクタエルゴノミクス と呼ばれる機能によって マシンスペック に応じた自動調整 が通常は行われます。
2GB以上の物理メモリおよび2コア以上の条件がそろえば、サーバクラスマシン と認識され、それ以外の場合には クライアントクラスマシン と認識され、実行エンジン、ヒープサイズやガベージコレクタのアルゴリズム等、必要最低限ではありますが調整が行われます。
詳細のオプションについては HotSpot VMのリファレンス をご覧ください。
シリアルコレクタ
昨今のハードウェアの廉価化も進み、コンシューマPCにおいてもCPUコアが複数搭載されているケースも普通になってきましたが、シリアルコレクタは従来のシングルコアマシン用に設計されている最も基本的なガベージコレクタになります。特にこれといった性能上の利点はありませんが、クライアントスペックマシンにおけるデフォルトのガベージコレクタ になります。マイナーGCおよびメジャーGCともにアプリケーションスレッドの実行を中断し、シングルスレッドで動作します。
他のガベージコレクタや、JVM内部のバグ等による ワークアラウンドとして使用 することが想定されます。
シリアルコレクタの動作イメージ
パラレルコレクタ
本記事は、日本サード・パーティ株式会社(JTP)にて、執筆しています。
JTPは約30年に渡り、様々なベンダーのサポートを行う企業です。 設計、構築、開発、運用、ヘルプデスク、トレーニングなど、ITのライフサイクルを通して技術サービスを提供しています。
中でも、JTP の IT教育サービスでは、クラウド、Hadoop関連技術など、OSS の最新技術 トレーニングを数多く実施しています。
JTPでは、経験豊富なエンジニア、講師陣により、多くの技術記事を公開しております。
▼JTPの情報メディア「JTP Technology Port」はこちらから!