「Java」GC ログを出力する

JavaGC ログを出力する方法についてメモ ( よく忘れるのですぐに引っ張ってこれる情報として残しておく )。

java コマンドのオプションに "-Xloggc:<ファイル名>" をつけてやるだけで出力される。

java
http://docs.oracle.com/javase/7/docs/technotes/tools/windows/java.html

とりあえず、以下のようなプログラムを用意する。

import java.util.*;
import java.lang.*;

class Sample {
	public static void main(String[] args) {
		
		System.out.println("start");
		
		for(int i = 0; i < 100; i++) {
			List<String> list = new ArrayList<String>();
			for(int j = 0; j < 10000; j++) {
				list.add("test" + j);
				System.out.println(list.get(j));
			}
		}
		System.out.println("end");
	}
}

ヒープサイズを少なめに指定して実行する。

java -Xmx5m -Xms5m -Xloggc:gc.log Sample > output.txt

すると以下のような GC ログが得られる。

0.192: [GC 2048K->887K(6144K), 0.0014012 secs]
0.255: [GC 2935K->933K(6144K), 0.0023044 secs]
 - 略 -
0.849: [GC 4467K->3786K(5632K), 0.0008509 secs]
0.850: [Full GC 3786K->994K(7168K), 0.0114225 secs]
0.889: [GC 2018K->1442K(7168K), 0.0005910 secs]
 - 略 -


あと、オプションに "-XX:+PrintGCDetails"、"-XX:+PrintGCTimeStamps" あたりを指定してやると、もう少し詳細な情報が得られるみたいです。

java -Xmx5m -Xms5m -Xloggc:gc.log -XX:+PrintGCDetails -XX:+PrintGCTimeStamps Sample > output.txt
0.183: [GC [PSYoungGen: 2048K->495K(2560K)] 2048K->887K(6144K), 0.0011911 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
0.244: [GC [PSYoungGen: 2543K->510K(2560K)] 2935K->1118K(6144K), 0.0010508 secs] [Times: user=0.02 sys=0.00, real=0.00 secs] 
 - 略 -
0.847: [Full GC [PSYoungGen: 438K->0K(2048K)] [ParOldGen: 3402K->994K(5120K)] 3841K->994K(7168K) [PSPermGen: 2526K->2525K(21504K)], 0.0110775 secs] [Times: user=0.02 sys=0.00, real=0.01 secs] 
0.886: [GC [PSYoungGen: 1024K->448K(2048K)] 2018K->1442K(7168K), 0.0007287 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
 - 略 -


ログの見方は以下のドキュメントに書いてありました。
JVM Performance Tuning
- Diagnosing GC Issues ( P52 あたりから )
http://www.oracle.com/technetwork/cn/community/developer-day/2-jvm-tuning-1866448-zhs.pdf


コンカレント GC にすると、以下のような GC ログになる ( この場合の見方も上記のドキュメントにちょっと記載あり )。

0.144: [GC0.144: [ParNew: 1088K->128K(1216K), 0.0019545 secs] 1088K->576K(4992K), 0.0020734 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
0.247: [GC0.247: [ParNew: 1216K->128K(1216K), 0.0013556 secs] 1664K->866K(4992K), 0.0014187 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
0.312: [GC0.312: [ParNew: 1216K->127K(1216K), 0.0010474 secs] 1954K->1144K(4992K), 0.0011114 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
0.362: [GC0.362: [ParNew: 1189K->128K(1216K), 0.0009632 secs] 2207K->1422K(4992K), 0.0010302 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
0.425: [GC0.425: [ParNew: 1216K->126K(1216K), 0.0010969 secs] 2510K->1818K(4992K), 0.0011570 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
0.489: [GC0.489: [ParNew: 1208K->128K(1216K), 0.0009436 secs] 2900K->2207K(4992K), 0.0009910 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
0.490: [GC [1 CMS-initial-mark: 2079K(3776K)] 2282K(4992K), 0.0002152 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
0.491: [CMS-concurrent-mark-start]
0.492: [CMS-concurrent-mark: 0.002/0.002 secs] [Times: user=0.03 sys=0.02, real=0.00 secs] 
0.492: [CMS-concurrent-preclean-start]
0.493: [CMS-concurrent-preclean: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
0.493: [GC[YG occupancy: 223 K (1216 K)]0.493: [Rescan (parallel) , 0.0002837 secs]0.493: [weak refs processing, 0.0000124 secs]0.493: [scrub string table, 0.0000957 secs] [1 CMS-remark: 2079K(3776K)] 2303K(4992K), 0.0004365 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
 - 略 -


このあたりはまだまだ勉強が必要ですな・・・

以上です。