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の項目にある数値は、上段のコールスタック一覧の該当項目を表しているのでそこを見る。
以上。