2012-02-12

Java: OmitStackTraceInFastThrow

あるとき開発者からこんなことを聞かれた。

「Java のスタックトレースが出なくなることがあるんだけど、リモートデバッグを始めると出るようになるんだよ。そしてリモートデバッグを止めると、また出なくなるの。そういうの、何か知らない?」

最初、「この人は何を言ってるんだろう? :-o」と思っていたが、念のため調べてみると・・・、

本当にあったー!

OmitStackTraceInFastThrow が原因らしい。こいつはデフォルトで ON になっているので、OFF にするにはオプション -XX:-OmitStackTraceInFastThrow を使う。

昔 Java のオプションを決めるときに散々調べたけど、このオプションは見なかったなー。GC 関連のオプションは飽きるほど見たけど。でもこれはもっと有名になっても良いオプションだと思う。

サーバ VM のコンパイラではすべての「コールド」組み込み例外に対する的確なスタックバックトレースを提供しています。このような例外が数回スローされると、パフォーマンス向上のため、メソッドが再コンパイルされることがあります。再コンパイルの後、コンパイラはスタックトレースを提供しない事前割り当て済みの例外を使用して、より速い方法を選択できます。事前割り当て済みの例外を全く使用しないようにするには新しいフラグ -XX:-OmitStackTraceInFastThrow を使用します。

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。