周五在公司搭好的ELK上查看日志,组长让看看其中NullPointerException出现很多的原因。

通过NullPointerException搜索,点看其中一个查看,发现异常的信息就一行java.lang.NullPointerException,并没有堆栈信息。

看了几个都没有,然后翻代码看记日志的地方,调用了日志基础工程的一个方法,异常对象通过封装传了进去,其中异常信息属性取值用的是Throwables.getStackTraceAsString(e),这是guava包提供的方法,点进去看是取了所有堆栈信息的。

那么问题来了,为什么堆栈信息没显示出来呢?

百度了下,关键字:NullPointerException 没有堆栈

找到类似的问题,发现是JVM虚拟机对异常信息进行了优化,当相同异常出现很多次,会认为它是热点异常,忽略掉异常堆栈信息;通过增加JVM参数:-XX:-OmitStackTraceInFastThrow可解决。

而项目工程里那个异常,产生来源是一个storm计算过程,它每天会进行很多次,因此很可能就是这个原因。

于是修改storm启动脚本,增加此JVM参数:-XX:-OmitStackTraceInFastThrow。重新提交topology到storm,很快能查看到最新的NullPointerException日志,看异常堆栈信息已完整输出,能够定位到具体代码行了。

本机写了个简单程序测试,循环很多次调用产生NullPointerException的方法,只打印最后一次异常:

 package com.cdfive.learn.guava;

 import com.google.common.base.Throwables;

 /**
* 堆栈信息丢失测试
* -XX:-OmitStackTraceInFastThrow
* @author five
* @date 2018-05-27
*/
public class ThrowablesTest {
public static void main(String[] args) {
int max = 100;
// int max = 10000;// jvm参数增加-XX:-OmitStackTraceInFastThrow,否则只输出java.lang.NullPointerException,没有堆栈信息
for (int i = 1; i <= max; i++) {
try {
npeMethod();
} catch (NullPointerException e) {
if (i == max) {
System.out.println(Throwables.getStackTraceAsString(e));
}
}
}
} public static void npeMethod() {
String s = null;
s = s.substring(0);
}
}

当max=100时,数量较少,能输出完整的异常堆栈:

java.lang.NullPointerException
  at com.cdfive.learn.guava.ThrowablesTest.npeMethod(ThrowablesTest.java:28)
  at com.cdfive.learn.guava.ThrowablesTest.main(ThrowablesTest.java:17)

当 max=10000时,输出结果中堆栈丢失了:

java.lang.NullPointerException

在JVM启动参数中增加:-XX:-OmitStackTraceInFastThrow后,又能够输出完整的异常堆栈了。

-----------------------------------------------------------------------------------------------------------------------------------

参考:
JVM参数分享 OmitStackTraceInFastThrow https://www.jianshu.com/p/e87d166380eb

https://blog.csdn.net/shfqbluestone/article/details/70978852

https://blog.csdn.net/taotao4/article/details/43918131

NullPointerException 没有堆栈的更多相关文章

  1. JVM参数OmitStackTraceInFastThrow:不打印NullPointerException异常堆栈

    查看线上日志,遇到一个诡异的问题,就是系统大量空指针的异常,但是没有打印堆栈,导致不方便定位问题. 经过一番代码调试,确定并非程序代码问题.没有线索之后,从Google找到了答案:是因为在server ...

  2. 【Java】 NullPointerException、ArrayIndexOutOfBoundsException、ClassCastException、ArrayIndexOutOfBoundsException、ArrayStoreException、ArithmeticException等没有异常堆栈信息

    今天工作中,临时Fix一个bug,一看日志“java.lang.ClassCastException: null”相当懵逼,没有详细堆栈信息,这咋整.虽然根据上下文可以推测代码的大致位置,但不敢拍板确 ...

  3. Android:如何从堆栈中还原ProGuard混淆后的代码

    本文翻译自Android: How To Decode ProGuard's Obfuscated Code From Stack Trace 本篇文章是写给那些在他们的应用中使用ProGuard并且 ...

  4. 几个简单的例子让你读懂什么是JAVA的堆栈跟踪

      简单的来说,堆栈跟踪就是我们的程序在抛出异常时使用的方法调用列表. 简单的例子 通过问题中给出的示例,我们可以准确地确定应用程序中抛出异常的位置. 我们来看看堆栈跟踪: Exception in ...

  5. log4j打印堆栈信息

    原文地址:https://blog.csdn.net/xianyu_0418/article/details/6043174 大家都知道,网站在运行的过程中,打印必要的log对记录网站的运行情况.从而 ...

  6. 异常 Exception 堆栈跟踪 异常捕获 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  7. java.lang.NullPointerException - 如何处理空指针异常

    当应用程序试图null在需要对象的情况下使用时抛出.这些包括: 调用null对象的实例方法. 访问或修改null对象的字段. 把长度null当作一个数组. 像访问或修改null阵列一样访问或修改插槽. ...

  8. [置顶] OpenJDK源码研究笔记(九)-可恨却又可亲的的异常(NullPointerException)

    可恨的异常 程序开发过程中,最讨厌异常了. 异常代表着程序出了问题,一旦出现,控制台会出现一屏又一屏的堆栈错误信息. 看着就让人心烦. 对于一个新人来讲,遇到异常经常会压力大,手忙脚乱,心生畏惧. 可 ...

  9. NullPointerException异常的原因及java异常??

    所谓空指针异常,是因为用空(null)去调用属性或方法.   null表示没有这个对象,既然没有这个对象,那么去调用他的属性和方法,就会报异常.   <--主要有以下几种原因:   1.使用了未 ...

随机推荐

  1. java技术面试之面试题大全

    转载自:http://blog.csdn.net/lijizhi19950123/article/details/77679489 Java 面试知识点总结 本篇文章会对面试中常遇到的Java技术点进 ...

  2. nps内网渗透利用

    0x00 前言 对比了比较多的代理工具,如ew流量不稳定,容易断:frsocks目前免杀,也是容易断.frp需要落地配置文件,不符合渗透的规则.reg正向的socks,速度比较慢,扫描是个问题.其实我 ...

  3. Delphi 画笔

    樊伟胜

  4. Spring mvc 初始化过程

    1.DispatcherServlet:获取servlet的name 2.XmlWebApplicationContext:获取contentConfigLocation的xml名称和namespac ...

  5. PAT Basic 1022 D进制的A+B (20 分)

    输入两个非负 10 进制整数 A 和 B (≤),输出 A+B 的 D (1)进制数. 输入格式: 输入在一行中依次给出 3 个整数 A.B 和 D. 输出格式: 输出 A+B 的 D 进制数. 输入 ...

  6. Java类的反射

    一.类对象与反射 先来简单介绍一下反射,反射使得程序员能够更加的了解一个类,包括获得构造方法.成员方法.成员域包括注解等. 1.访问构造方法 访问构造方法有四种方式, getDeclaredConst ...

  7. TCP_Wrappers应用层防火墙

    TCP_Wrappers是一个工作在应用层的安全工具,它只能针对某些具体的应用或者服务起到一定的防护作用.比如说ssh.telnet.FTP等服务的请求,都会先受到TCP_Wrappers的拦截. T ...

  8. 洛谷P3690 Link Cut Tree (动态树)

    干脆整个LCT模板吧. 缺个链上修改和子树操作,链上修改的话join(u,v)然后把v splay到树根再打个标记就好. 至于子树操作...以后有空的话再学(咕咕咕警告) #include<bi ...

  9. 你还不知道这款VCL界面开发工具?DevExpress VCL v19.1.6来袭

    DevExpress VCL Controls是 Devexpress公司旗下最老牌的用户界面套包.所包含的控件有:数据录入,图表,数据分析,导航,布局,网格,日程管理,样式,打印和工作流等,让您快速 ...

  10. PHP swoole TCP服务端和客户端

    服务端 <?php $server = ,SWOOLE_PROCESS,SWOOLE_SOCK_TCP); $server->set(array( , )); $server->on ...