【事象】
以下のようなとき、例外のスタックトレースがまったく出力されないことがある。
try{
// ・・・
} catch(NullPointerException e) {
log.error("error!", e);
}
e.getStackTrace().lengthで、
例外のスタックトレースサイズを見ると、0になっている。
【原因】
JVMは、同じような箇所で組み込み例外が繰り返しthrowされると、
メソッドを再コンパイルして最適化することがある。
この最適化されたメソッドでは、
JVMが事前に用意した例外インスタンスがthrowされ、
その例外インスタンスにはスタックトレースが提供されない。
これが原因。
-XX:-OmitStackTraceInFastThrowオプションでJVMを起動することで、
この最適化を無効にすることができる。
http://java.sun.com/j2se/1.5.0/ja/relnotes.html
(HotSpot VM 参照)