Javaでは、完全な、切り捨てられていないスタックトレースを表示する方法はありますか(たとえば、記録されるフレームの数を増やすことによって)、またはスタックトレースの一番下に表示する方法はありますか?通常、スタックトレースは、1024フレームの価値で上から切り捨てられますが、スタックオーバーフローの問題の場合、再帰をトリガーした呼び出しを誰が行ったかを下の方で確認する必要があるため、これはかなり価値がありません。スタックの途中で切り捨てる方がはるかに優れていますが、SunのJVMはこれを行うのに十分なほど賢くないようです。
おそらく、いくつかの特別な太陽固有のフラグでさえありますか?スタックサイズを最小許容値(-Xss1000)に減らしてみましたが、それでも1024フレーム以上の価値があります。
私の場合、Hadoopマッパーで発生するスタックオーバーフローをデバッグしようとしていますが、これは非常に大きな入力で実行している場合に限られます。問題が発生するのは、再帰操作(ScalaのfoldRight
)が非常に大きなリンクリストで実行されているためだと思います。非再帰的に書き直す必要があります...しかし、誰がを呼び出したかを知る必要がありますfoldRight
。これは、多くの場所で直接的および間接的に呼び出される基本的なルーチンであり、私が使用しているコードはたくさんあるので、これは非常に明白ではありません。