ファイヤープロジェクト
プロトタイプ1
2004-07-13T00:20+09:00   matsu
-verbose:gcで出てくるGCのログをtail -fのような感じで読み取ってグラフ化してみる.
こんなん.
一番目のグラフエリアの緑色の線がヒープサイズで,赤色がGC前,青色がGC後である.二番目のグラフエリアの黄色はGCにかかった時間である.三番目のグラフエリアのだいだい色は,全開のFull GCから何回GCしているかの累積である.つまりだいだい色が落ち込んでいるところがFull GCが起きているポイントである.サーバサイドだと理想的にはこのだいだい色が無限に増加し続けるのがよいような記事があるが,Weblogic8.1だと,パラGCだかスレッドGCというのがあるらしくて,なんかフルGCでもレスポンスが返るような噂を聞いたことがあるが,どうなんだ?
これ. 展開して,libの下に以下のjarを置く.
  • jfreechart
  • jcommon
  • xerces
  • log4j
動作確認時のjar.
jfreechart-0.9.16.jar  xerces.jar
jcommon-0.9.1.jar  log4j-1.1b7.jar
実行は
ant run
である.これで
/tmp/gc.log
を見てグラフ表示する.gc.logは
[Full GC 6148K->3310K(6160K), 0.1348114 secs]
[GC 3822K->3335K(6160K), 0.0021601 secs]
といったような記述が並ぶものである.これは
java -verbose:gc
などで標準出力に出てくる.GCMon自身を-verbose:gcで実行し出力を/tmp/gc.logに出力すると,出力グラフが発散することがあって面白いかもしれない.
今回JFreeChartオブジェクトは,GCLogXYDatasetなるクラスのオブジェクトをDatasetとして作成した.で,GCLogXYDatsetオブジェクトは,GCLogに折り返し委譲している.例えばgetXValue.
    public Number getXValue (int series, int item) {
	return gcLog.getXValue(startSeriesNo + series, item);
    }
クラス設計の善し悪しとしてどうよ?というのがあるが,ここではデータの更新に焦点を絞る.GCMonではGCLogに対してデータ更新をかける.
    public void start(){
	while (true) {
	    gcLog.update();
	    try {
		Thread.sleep(intervalTime);
	    } catch (InterruptedException e) {
		e.printStackTrace();
		System.exit(-1);
	    }
	}
    }
GCLogオブジェクトはupdateメソッド内で更新がかかっていればnotifyListenersを呼び出し,JFreeChartの描画更新を促す.
	if (updateFlag) {
	    notifyListeners(new DatasetChangeEvent(this, this));
ところが,そんなJFreeChartオブジェクトはいない.プロトタイプのJFreeChartはGCLogXYDatasetをDatasetとしているからである.そこで,GCLogXYDatasetをGCLogのリスナとして登録する.以下GCLogXYDatasetのコンストラクタ.
	gcLog.addChangeListener (this);
このためにはDatasetChangeListenerをimplementsする必要がある.そして,GCLogオブジェクトから更新通知を受けた際の処理を追加する.
    public void datasetChanged(DatasetChangeEvent event) {
	notifyListeners(new DatasetChangeEvent(this, this));
    }
これはインタフェースDatasetChangeListenerのメソッドである.これにより,
  1. GCMonでGCLogへデータ更新指示
  2. GCLogでデータ更新
  3. GCLogからGCLogXYDatasetへデータ更新通知
  4. GCLogXYDatasetからJFreeChartへデータ更新通知
と,データ更新通知のパスが通る.
  • GC,Full GC回数等,普通にカウンタを回したい.
  • 縦軸を対数にしてみたり.
  • GCログファイル等各種項目を設定できるようにする.
  • 今回はtail -fのようなものだったので,今度はlessのようなものにする.
matsu(C)
Since 2002
Mail to matsu