2011-01-11 46 views
40

在我的應用程序日誌中(使用log4j),我看到一個NullPointerException,但沒有堆棧跟蹤。我知道,作爲一種優化,當異常發生很多次時,jvm停止生成堆棧跟蹤。問題是前一段時間發生的異常,並且我的所有日​​志都填充了沒有堆棧跟蹤的異常。有沒有辦法「重置」這個機制,所以下一個拋出的異常將被打印完整的堆棧跟蹤?我不想重新啓動應用程序,因爲它很難重現此錯誤,並且重新啓動可能會導致「消失」...沒有堆棧跟蹤的循環異常 - 如何重置?

謝謝!

+1

「我知道,作爲一種優化,當異常發生很多次時,jvm停止產生堆棧跟蹤」。你知道這個怎麼樣?這不是真的。 – skaffman 2011-01-11 15:25:11

+0

它可能是因爲在catch塊中只有異常的原因已被記錄 – 2011-01-11 15:25:58

回答

66

嘗試用以下JVM屬性運行:

-XX:-OmitStackTraceInFastThrow 

Release Notes

在VM現在 提供正確的堆棧回溯的 所有的「冷」服務器編譯器內置例外。對於 的性能目的,當這種異常拋出幾次時,可能會重新編譯 方法。在 重新編譯之後,編譯器可以使用預分配的 異常來選擇更快的策略,該異常不會提供堆棧 跟蹤。要完全禁用預分配的例外使用 ,請使用此新標誌: -XX:-OmitStackTraceInFastThrow