Java、hprofで無限ループしてる位置を特定する
デバッガ使えや……とおっしゃるかもしれませんがantタスクをアタッチする方法がよくわからなかったので。
JVMのオプションに
-agentlib:hprof=cpu=samples
を指定。この指定方法は1.5以前だと違うとか何とかだけどまあそれはいい。
hprofというのは標準でついてくるプロファイラ。オプションとしてcpu=samplesを渡すことで、メソッドの実行時間をプロファイルすることができる。cpu=timesのほうがたぶん正確だけどすごく遅い。
そして無限ループしてるソースに細工して、しばらくしたら終了するようにしておく(Eclipseのコンソールからterminateしたらプロファイル結果が生成されなかった)
Thread t=new Thread(){ @Override public void run() { try { super.sleep(20000); } catch(InterruptedException e) {} System.exit(0); } }; t.start();
この状態でプログラムを実行するとカレントディレクトリにjava.hprof.txtというファイルができる。
最後のCPU SAMPLESという項目がメソッドの実行にかかった時間の一覧。最上段のメソッド、あるいはそこからコールスタックをたどったところにあるメソッドが無限ループしてる。
traceの項目にある数値は、上段のコールスタック一覧の該当項目を表しているのでそこを見る。
以上。