java中的exception stack有时候不输出的原因
有时候,我们在看java错误日志时,只看到一个java.lang.NullPointerException,却没有看到错误的栈,原因是启动时候有一项参数可以选择配置:OmitStackTraceInFastThrow
JVM 看不到某些异常的stacktrace问题
在java 1.5的release notes里面可以看到这样一句话:
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.
大体的意思就是对于cold build-in exception jvm都会throw 没有stacktrace的exception。从1.5开始提供了一个开关关闭此功能
public class TestCompile {
private static final int count = 1000000;
/**
* @param args
*/
public static void main(String[] args)throws Exception {
int index = count;
while(index -- > 0){
try {
work();
} catch (Exception e) {
e.printStackTrace();
}
}
}
private static void work(){
String value = null;
value.length();
}
}
编译后使用java -server -XX:-OmitStackTraceInFastThrow TestCompile 运行,发现一直都是类似
java.lang.NullPointerException
at TestCompile.work(TestCompile.java:25)
at TestCompile.main(TestCompile.java:17)
的stacktrace。
换成java -server -XX:+OmitStackTraceInFastThrow TestCompile 运行一段时间后就会出现
java.lang.NullPointerException
java.lang.NullPointerException
java.lang.NullPointerException
java.lang.NullPointerException
java.lang.NullPointerException
java.lang.NullPointerException
java.lang.NullPointerException
java.lang.NullPointerException
java.lang.NullPointerException
这样的exception,说明stacktrace 该优化已经起作用。-XX:+OmitStackTraceInFastThrow选项在-server情况下默认开启。
这就不难解释为何经常在系统日志中看到很多行的java.lang.NullPointerException 苦于找不到stacktrace而不知道错误出在何处。
遇到这种情况,解决的方法也很简单:既然在一段时间后jvm才会进行重新编译优化,那么该错误在刚开始出现的时候还是会有stacktrace的。所以向前搜索日志,或者将程序重启,观察刚重启时候的log便可以找到错误的stacktrace
最后注意的是,上述优化是针对all "cold" built-in exceptions ,不仅仅是NullPointerException
转载于:https://www.cnblogs.com/lemonlotus/p/5650687.html
java中的exception stack有时候不输出的原因相关推荐
- Java 中处理 Exception 的最佳实践
Java 中处理 Exception 的最佳实践 在Java中处理异常并不是一个简单的事情.不仅仅初学者很难理解,即使一些有经验的开发者也需要花费很多时间来思考如何处理异常,包括需要处理哪些异常,怎样 ...
- java 异常 中英文_史上最全的Java中所有Exception异常中英文对照
Java中所有Exception异常中英文对照AclNotFoundException, 如果对不存在的访问控制列表进行访问,则会 ArithmeticException 算数异常 ArrayInde ...
- Thinking in java中关于Exception的一道面试题.
今天看到Thinking in Java中一个关于Exception的例子: 最后看到有一篇总结的比较好的文章, 这里拿来记录下, 文章地址是:http://blog.csdn.net/salerzh ...
- JAVA中的Exception和Error之间的区别
请对比Exception和Error,另外,运行时异常与异常有什么区别? 典型回答: Exception和Error都是继承了Throwable类,在Java中只有Throwable类型的实例可以被抛 ...
- 在java中如何打出竖_java为什么输出结果是竖向的??(新人)
java为什么输出结果是竖向的??(新人) 关注:248 答案:6 mip版 解决时间 2021-01-27 04:01 提问者看不透忘不了 2021-01-26 20:23 public cla ...
- java中Date与DateFormat的格式输出
一.DateFormat java.text.DateFormat 使用 getDateInstance 来获取该国家/地区的标准日期格式.另外还提供了一些其他静态工厂方法.使用 getTimeIns ...
- 刷题upupup【Java中Queue、Stack、Heap用法总结】
[Queue] 先进先出(First-In-First-Out),LinkedList实现了Queue接口.它只允许在表的前端进行删除操作,而在表的后端进行插入操作. add() 增加一个 ...
- Java中如何实现数组输入和输出
这个问题是在洛谷刷题时遇到的,由于题解大都是C++写的所以只学了Java的我还看不懂,不过这个问题貌似不是很难,只需要利用循环让Scanner重复扫描就行了,但是之中还是有几个小坑的.我们直接看代码: ...
- Java中获取Exception的详细信息
当代码出现异常时通常都需要将异常信息写入到日志中,异常信息越详细越有利于问题的排查.而通过的Exception.getMessage()方法只能获得异常的名称而不能获取哪里出现的异常,对于排错意义不大 ...
最新文章
- crontab修改默认编辑器
- opencv图像遍历方法速度对比
- 时间怎么算用计算机,抖音珍惜时间计算器怎么用
- 【Mybatis】MyBatis 实现多表查询
- TensorFlow学习笔记(十二)TensorFLow tensorBoard 总结
- Linux内核分析作业第八周
- data structure最短路径问题
- [转]阿里云配置mysql远程连接
- python迷你停车场管理系统_python实现停车管理系统
- 【NOIP2013提高组】华容道
- 解决python的OverflowError: int too large to convert to float
- 11-TensorFlow 基于ResNet的轴承故障诊断
- 电脑tf卡检测不到_为什么电脑不识别TF卡?
- 多家高校网站被挂马 用户应小心QQ盗号木马
- Java 大文件分片上传
- 智商太低,居然算不出病狗神题了
- 世界上最快的计算机-泰坦和天河二号
- 微信ios签名报错config:fail
- linux的pacemaker集群
- 查找list中重复数据