周五在公司搭好的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. 分布式缓存系统 Memcached 快速入门

    Memcached介绍   官网地址      Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提 ...

  2. python 列表字典按照字典中某个valu属性进行排序

    对用户名进行排序 1. 直接上代码 base_dn_list = [ {', 'tenant': 'HAD', 'role': {'roleID': 'project', 'roleName': '项 ...

  3. bizcharts在火狐上的Invalid date报错

    bizcharts在火狐上的Invalid date报错,是因为 bizcharts 所用到的 fecha在 火狐上 只能接收日期对象类型的日期,不能接收日期字符串.

  4. 微服务之Nacos配置中心源码解析(二)

    Nacos配置中心源码解析 源码入口 ConfigFactory.createConfigService ConfigService configService = NacosFactory.crea ...

  5. IPC之shm.c源码解读

    // SPDX-License-Identifier: GPL-2.0 /* * linux/ipc/shm.c * Copyright (C) 1992, 1993 Krishna Balasubr ...

  6. Spinner simpleAdapte适配器 下拉列表

    public class MainActivity extends AppCompatActivity { private TextView text; private Spinner spinner ...

  7. MyBatis 报错org.apache.ibatis.session.defaults.DefaultSqlSessionFactory.openSessionFromDataSource

    报错如下: org.apache.ibatis.exceptions.PersistenceException: ### Error opening session. Cause: java.lang ...

  8. Java常用类(二) Scanner类和大数类

    二.Scanner类 有C系语言基础的可能都比较熟悉scanf("%d",&a);和cin>>a;这种代码,也打开了程序交互的第一道门.因此,这些程序员开始学J ...

  9. SSH框架整合报错org.springframework.web.context.ContextLoaderListener

    是因为在导入的jar包中缺少了一个 org.springframework.web_3.1.4.release.jar 在网上下载即可 下载地址: http://www.java2s.com/Code ...

  10. Java-ConnectDB工具类

    import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; /** * 功能描述: ...