有时候,我们在看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

java中的exception stack有时候不输出的原因的更多相关文章

  1. java中的exception stack有时候不输出的原因(转)

    原文  https://www.cnblogs.com/lemonlotus/p/5650687.html 有时候,我们在看java错误日志时,只看到一个java.lang.NullPointerEx ...

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

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

  3. Java中1.0 / 0.0 会输出什么?

    蓝桥杯失利后发现算法与数据结构的重要性,开始学习算法,刚刚在看<算法4>,看到了这么个东西,让我对java中的size运算有了新的感悟. 在java中输出1/0会发生什么,毫无疑问会报异常 ...

  4. java中的栈Stack

    Stack:栈是一种只能在一端进行插入或删除操作的线性表.(先进后出表) java中的Stack继承Vector 实例化 Stack stack=new Stack(); 基本使用 判断是否为空 st ...

  5. java 中的Exception RuntimeException 区别

    在java的异常类体系中: 1.Error和RuntimeException是非检查型异常,其他的都是检查型异常; 2.所有方法都可以在不声明throws的情况下抛出RuntimeException及 ...

  6. java中Set,Map,Stack一些简单用法

    import java.util.Iterator; import java.util.Stack; import java.io.*; import java.util.Set; import ja ...

  7. Java如何将Exception.printStackTrace()转换为String输出

    package com.test1; import java.io.PrintWriter; import java.io.StringWriter; public class T010 { /** ...

  8. JAVA中调用CMD命令,并输出运行结果

    package com.wzw.util; import java.io.BufferedReader; import java.io.InputStreamReader; public class ...

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

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

随机推荐

  1. python异常链

    习惯使用java开发,在java开发里有异常链概念和重新抛出异常,在python是怎么实现的呢? 1.异常链 1.1.java实现 public static void test1() throws ...

  2. 【SVN】彻底 svn 服务器上的 删除某一个文件或文件夹

    参考: CSDN1:https://blog.csdn.net/u011729865/article/details/78764523 CSDN2:https://blog.csdn.net/wyyo ...

  3. Linux 操作memcache命令行

    telnet 127.0.0.1 11211 连接 memcache stats 查看 memcache 状态 状态说明: pid memcache服务器的进程ID uptime 服务器已经运行的秒数 ...

  4. Bootstrap form-group and form-control

    https://github.com/twbs/bootstrap/blob/21f3375f21e9a7a5155d0cd783fd2bc7aeee8485/scss/_forms.scss htt ...

  5. linux内核中的wait_event_interruptible_timeout接口解析

    1. 原型 #define wait_event_interruptible_timeout(wq_head, condition, timeout) \ ({ \ long __ret = time ...

  6. kotlin嵌套类

    就是类中定义类 package loaderman.demo class Outer { var name: String = "name" inner class inner { ...

  7. 阶段5 3.微服务项目【学成在线】_day03 CMS页面管理开发_05-新增页面-服务端-接口测试

    其从程序swaggerUI测试 pageName和别名都是 test003 { "dataUrl": "string", "htmlFileId&qu ...

  8. 关于对VGA、DVI、HDMI的区别

    VGA接口: DVI接口: HDMI接口 可以这么理解: 1. VGA传输普通视频信号,DVI传输高清视频信号,HDMI传输高清视频信号并支持音频传输.2. HDMI的三种接口只有大小区别,功能没有任 ...

  9. JQ也要面向对象~在JQ中扩展静态方法和实例方法(jq扩展方法)

    JQ也要面向对象,事实上,无论哪种开发语言,在开发功能时,都要把面向对象拿出来,用它的思想去干事,去理解事,面向对象会使问题简单化,清晰化,今天说两个概念“静态方法”与“实现方法”,这个在面向对象的语 ...

  10. 前端如何避免bug的产生?

    项目环境:react生态圈 界面功能基本和:增(新增一条数据).删(删除一条数据).查(展示列表).改(修改数据)挂钩. 一.展示数据列表相关[判空,控制显示距离,分页是否有效,搜索是否有效] 1.渲 ...