Java 7のガーベジコレクションの入り口
Java 7のガーベジコレクションの仕様や実装を調べるなら、次の2つが入り口となるでしょう。
Java 7でガーベジコレクションを選択する方法(6種類)
Java 7ではエルゴノミクス機能により、自動的にガーベジコレクション(GC)を決定します。
エルゴノミクス機能による決定を無効にして自分でGCを選択したい場合、次の6種類のオプションの指定方法があります。
- -XX:+UseSerialGC
- -XX:+UseParallelGC
- -XX:+UseParallelGC -XX:+UseParallelOldGC
- -XX:+UseConcMarkSweepGC
- -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode
- -XX:+UseG1GC
- -XX:+UseSerialGC
- New世代領域、Old世代領域ともに、GCを単一スレッドで実行。
- -XX:+UseParallelGC
- New世代領域では、GCを複数スレッドで実行。
- Old世代領域が不足したら、Full GCを単一スレッドで実行。
- -XX:+UseParallelGC -XX:+UseParallelOldGC
- New世代領域では、GCを複数スレッドで実行。
- Old世代領域が不足したら、Full GCを複数スレッドで実行。
- -XX:+UseConcMarkSweepGC
- New世代領域は-XX:+UseParallelGCと同様の処理。
- Old世代領域でCMS GCを実行。
- CMS GCは、アプリケーションスレッドと並列してGCを実行することにより、Stop the worldを減らすのが狙い。
- CMS GCはコンパクションを行わないので、CMS GCでもメモリが不足する場合は、フォールバックとしてFull GCを実行。
- -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode
- -XX:+UseConcMarkSweepGCをインクリメンタル・モードで実行。
- インクリメンタルモードの詳細は未調査だが、Old世代領域のGCを少しずつ実行するイメージ)
- Oracleのドキュメントでは「i-cms」で説明されています。
- -XX:+UseG1GC
- Java 7新機能のG1 GCを実行。
- Javaヒープを細かく細分化し、New世代領域やOld世代領域などを割り当てる方式。
- 詳細は、上の「Getting Started with the G1 Garbage Collector」を参照。
なお、Full GCはMark Sweep and Compaction方式です。
また「-Xincgc」は上の5つめの「-XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode」と同じになります。
なおCMS GCは「Concurrent Mark Sweep [Garbage] Collectorの略称で、CMS GCの説明は「Java SE 6 HotSpot™ Virtual Machine Garbage Collection Tuning」にあります。
Java 7でのSystem.gc()の実行について
十分プログラムを追えていませんが、
- \jdk\src\share\classes\java\lang\Runtime.java
- \jdk\src\share\native\java\lang\Runtime.c
- hotspot\src\share\vm\prims\jvm.cpp
- hotspot\src\share\vm\memory\universe.cpp
と追っていくと、
- GenCollectedHeap::collect(GCCause::Cause cause)と
- G1CollectedHeap::collect(GCCause::Cause cause)
に辿り着きます。
条件によっては、FullGCを実行するように見えます。「条件によっては」と書いたのですが、基本的にFull GCになると期待しています。
「Java™ Platform, Standard Edition 7 API Specification」のRuntime.gc()のところに
Runs the garbage collector. Calling this method suggests that the Java virtual machine expend effort toward recycling unused objects in order to make the memory they currently occupy available for quick reuse. When control returns from the method call, the virtual machine has made its best effort to recycle all discarded objects.
ガベージコレクタを実行します。このメソッドを呼び出すと、Java 仮想マシンは使用していないオブジェクトをリサイクルし、使用中のメモリーをすばやく再利用可能な状態にします。メソッド呼び出しから制御が戻された時点で、仮想マシンは破棄されたオブジェクトをすべて再利用するよう最善を尽くしたことになります。
とあります。Full GCを実行することが明記されていないし、コンパクションを行うかも判りませんが、「-verbose:gc」でログを取るなどしてウラを取ってみたいと考えています。