有时候,我们在看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有时候不输出的原因相关推荐

  1. Java 中处理 Exception 的最佳实践

    Java 中处理 Exception 的最佳实践 在Java中处理异常并不是一个简单的事情.不仅仅初学者很难理解,即使一些有经验的开发者也需要花费很多时间来思考如何处理异常,包括需要处理哪些异常,怎样 ...

  2. java 异常 中英文_史上最全的Java中所有Exception异常中英文对照

    Java中所有Exception异常中英文对照AclNotFoundException, 如果对不存在的访问控制列表进行访问,则会 ArithmeticException 算数异常 ArrayInde ...

  3. Thinking in java中关于Exception的一道面试题.

    今天看到Thinking in Java中一个关于Exception的例子: 最后看到有一篇总结的比较好的文章, 这里拿来记录下, 文章地址是:http://blog.csdn.net/salerzh ...

  4. JAVA中的Exception和Error之间的区别

    请对比Exception和Error,另外,运行时异常与异常有什么区别? 典型回答: Exception和Error都是继承了Throwable类,在Java中只有Throwable类型的实例可以被抛 ...

  5. 在java中如何打出竖_java为什么输出结果是竖向的??(新人)

    java为什么输出结果是竖向的??(新人) 关注:248  答案:6  mip版 解决时间 2021-01-27 04:01 提问者看不透忘不了 2021-01-26 20:23 public cla ...

  6. java中Date与DateFormat的格式输出

    一.DateFormat java.text.DateFormat 使用 getDateInstance 来获取该国家/地区的标准日期格式.另外还提供了一些其他静态工厂方法.使用 getTimeIns ...

  7. 刷题upupup【Java中Queue、Stack、Heap用法总结】

    [Queue] 先进先出(First-In-First-Out),LinkedList实现了Queue接口.它只允许在表的前端进行删除操作,而在表的后端进行插入操作. add()       增加一个 ...

  8. Java中如何实现数组输入和输出

    这个问题是在洛谷刷题时遇到的,由于题解大都是C++写的所以只学了Java的我还看不懂,不过这个问题貌似不是很难,只需要利用循环让Scanner重复扫描就行了,但是之中还是有几个小坑的.我们直接看代码: ...

  9. Java中获取Exception的详细信息

    当代码出现异常时通常都需要将异常信息写入到日志中,异常信息越详细越有利于问题的排查.而通过的Exception.getMessage()方法只能获得异常的名称而不能获取哪里出现的异常,对于排错意义不大 ...

最新文章

  1. crontab修改默认编辑器
  2. opencv图像遍历方法速度对比
  3. 时间怎么算用计算机,抖音珍惜时间计算器怎么用
  4. 【Mybatis】MyBatis 实现多表查询
  5. TensorFlow学习笔记(十二)TensorFLow tensorBoard 总结
  6. Linux内核分析作业第八周
  7. data structure最短路径问题
  8. [转]阿里云配置mysql远程连接
  9. python迷你停车场管理系统_python实现停车管理系统
  10. 【NOIP2013提高组】华容道
  11. 解决python的OverflowError: int too large to convert to float
  12. 11-TensorFlow 基于ResNet的轴承故障诊断
  13. 电脑tf卡检测不到_为什么电脑不识别TF卡?
  14. 多家高校网站被挂马 用户应小心QQ盗号木马
  15. Java 大文件分片上传
  16. 智商太低,居然算不出病狗神题了
  17. 世界上最快的计算机-泰坦和天河二号
  18. 微信ios签名报错config:fail
  19. linux的pacemaker集群
  20. 查找list中重复数据

热门文章

  1. 【物联网智能网关-03】GPRS模块中文短信收发
  2. hdu3033---加限制条件的0-1背包
  3. NetBeans 时事通讯(刊号 # 89 - Jan 28, 2010)
  4. 单例模式(singleton)解析例子
  5. [GXOI/GZOI2019]旧词——树链剖分+线段树
  6. flink sql是否支持emit策略
  7. Yarn管理界面中各个参数和yarn-site.xml中参数的对应关系
  8. saleor设置braintree支付方式
  9. 命令行中只用scala来运行一个spark应用
  10. arcball 鼠标 相机转动