强制要求JVM始终抛出含堆栈的异常(-XX:-OmitStackTraceInFastThrow)
2012-11-22 11:55
295 查看
强制要求JVM始终抛出含堆栈的异常(-XX:-OmitStackTraceInFastThrow) 问题描述:生产环境抛异常,但却没有将堆栈信息输出到日志,可以确定的是日志输出时用的是log.error("xx发生错误", e) 问题分析:它跟JDK5的一个新特性有关,对于一些频繁抛出的异常,JDK为了性能会做一个优化,即JIT重新编译后会抛出没有堆栈的异常 而在使用-server模式时,该优化选项是开启的,因此在频繁抛出某个异常一段时间后,该优化开始起作用,即只抛出没有堆栈的异常信息 问题解决:由于该优化是在JIT重新编译后才起作用,因此起初抛出的异常还是有堆栈的,所以可以查看较旧的日志,寻找完整的堆栈信息 另一个解决办法是暂时禁用该优化,即强制要求每次都要抛出有堆栈的异常,幸好JDK提供了通过配置JVM参数的方式来关闭该优化 即-XX:-OmitStackTraceInFastThrow,便可禁用该优化了(注意选项中的减号,加号则表示启用) 官方说明:The compiler in the server VM now provides correct stack backtraces for all "cold" built-in exceptions. For performance purposes, when such an exception is thrown a few times, the method may be recompiled. After recompilation, the compiler may choose a faster tactic using preallocated exceptions that do not provide a stack trace. To disable completely the use of preallocated exceptions, use this new flag: -XX:-OmitStackTraceInFastThrow.
相关文章推荐
- 强制要求JVM始终抛出含堆栈的异常(-XX:-OmitStackTraceInFastThrow)
- 强制要求JVM始终抛出含堆栈的异常(-XX:-OmitStackTraceInFastThrow)
- 强制要求jvm每次都要抛出有堆栈的异常
- OmitStackTraceInFastThrow参数
- RailsCasts中文版,#24 The Stack Trace 利用异常堆栈调试问题
- 异常抛出e.printStackTrace();工作原理
- How can I throw an exception without losing the original stack trace information in .NET?
- 使用log4j的时候如何输出printStackTrace()的堆栈信息
- 重新抛出异常——fillInStackTrace()
- Java知多少(49)throw:异常的抛出
- 启动tomcat时 错误: 代理抛出异常 : java.rmi.server.ExportException: Port already in use: 1099的解决办法
- java.net.BindException: Address already in use: JVM_Bind的异常
- 使用日志框架如何输出printStackTrace()的堆栈信息
- throw在try中抛出异常,然后用catch捕捉并处理这个异常,同时catch也可以再次抛出这个异常
- 使用log4j的时候如何输出printStackTrace()的堆栈信息
- 在Android M及更高版本中使用 Settings.System 抛出异常"You cannot keep your settings in the secure settings. "
- java异常分析;剖析printStackTrace和fillInStackTrace
- JAVA 语言如何进行异常处理,关键字:throws,throw,try,catch,finally 分别代表什么意义?在 try 块中可以抛出异常吗?
- 线程 堆栈跟踪信息 StackTraceElement
- FlashDevelop 调试时 JVM 抛出异常,无法加载 DLL“jvm.dll”: 找不到指定的模块。