« 運動 | メイン | BEA WebLogic Troubleshooting Methodology »

2005年03月10日

System.gc() を呼び出しているのは誰だ!

という課題にぶち当たったので、前から注目していた jt を試してみた。
・jt (java trace?)
http://www.physalis.net/ss/space/jt

1. 定期的にガベージコレクションをするクラスを作成。
------
public class GC{
  public static void main(String args[])throws Exception{
    while(true){
      Thread.sleep(1000);
      new GCInvoker().doGC();
    }
  }
}

class GCInvoker{
  public void doGC(){
    System.gc();
  }
}
-----

2. GC クラスをデバッグオプションをつけて起動
$ java -Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n GC &

3. jt を起動
リアルタイムには表示されないみたい(バッファされてる?)
ctrl+c で終了するとトレースがとれた。すげぇ!

$ ./jt -H localhost -p 8000 -t
^C#1 GCInvoker.() (GC.java:13)
#1 Object.() (Object.java:20)
#1 GCInvoker.doGC() (GC.java:15)
#1 System.gc() (System.java:737)
#1 Runtime.getRuntime() (Runtime.java:39)
#1 Runtime.gc() (Runtime.java:???)
#1 Thread.sleep(long) (Thread.java:???)
#1 GCInvoker.() (GC.java:13)
#1 Object.() (Object.java:20)
#1 GCInvoker.doGC() (GC.java:15)
#1 System.gc() (System.java:737)
#1 Runtime.getRuntime() (Runtime.java:39)
#1 Runtime.gc() (Runtime.java:???)
#1 Thread.sleep(long) (Thread.java:???)
#1 GCInvoker.() (GC.java:13)
#1 Object.() (Object.java:20)
#1 GCInvoker.doGC() (GC.java:15)
#1 System.gc() (System.java:737)
#1 Runtime.getRuntime() (Runtime.java:39)
#1 Runtime.gc() (Runtime.java:???)
#1 Thread.sleep(long) (Thread.java:???)
======== Threads =========
thread#1 - main

4. 所感
トレースをとるクラスをフィルタかけたりできるみたい。たとえば "java.lang.System"にフィルタをかけると、"System.gc()" だけが表示される。
今回のユースケースでは、そのメソッドを呼び出すまでにいたった経緯を知りたいので、フィルタをかけていても呼び出し元からのスタックを全部表示してくれたりするオプションがあったりするとステキ。
#出力を料理すればなんとでもなるけども

投稿者 yusuke : 2005年03月10日 12:07

トラックバック

このエントリーのトラックバックURL:
http://yusuke.homeip.net/diary/mt/mt-tb.cgi/205

コメント