查看线上日志,遇到一个诡异的问题,就是系统大量空指针的异常,但是没有打印堆栈,导致不方便定位问题. 经过一番代码调试,确定并非程序代码问题.没有线索之后,从Google找到了答案:是因为在server模式下运行的时候,有一个默认选项是-XX:+OmitStackTraceInFastThrow,这个玩意的意思就是当大量抛出同样的异常的后,后面的异常输出将不打印堆栈.这个参数想想很合理,正常情况下,如果打印了几万条异常堆栈是很容易发现问题的.但是我们的系统正好赶上访问量高峰,一不留神就错过打印详细…
背景 在开发Java应用程序的时候,遇到程序抛异常,我们通常会把抛异常时的运行时环境保存下来(写到日志文件或者在控制台中打印出来).这样方便后续定位问题. 需要记录的运行时环境包含两部分内容:抛异常时的参数信息和函数调用堆栈.针对堆栈信息,如果直接调用Exception的getStackTrace方法获取将得到这样一句没用的信息: [Ljava.lang.StackTraceElement;@4361bd48 我们希望能打印完整的调用堆栈,像这样: com.elon.FileNoExistExc…
所谓空指针异常,是因为用空(null)去调用属性或方法.   null表示没有这个对象,既然没有这个对象,那么去调用他的属性和方法,就会报异常.   <--主要有以下几种原因:   1.使用了未初始化的变量(虽然已经声明)   2.使用了未初始化的对象(虽然已经声明)   3.使用了关键字或已存在的类名作变量对象方法或类名.   当应用程序试图在需要对象的地方使用 null 时,抛出该异常.   <--这种情况包括:   调用 null对象的实例方法.   访问或修改null对象的字段.  …
今天去服务器后台看日志,发现有很多NullPointerException异常.我下意识的找异常栈,想看下到底是哪行代码导致了空指针.但是发现日志中只打印出了如下日志: null java.lang.NullPointerException: null 我怀疑是不是打印日志的时候是不是没有将异常栈打印出来,于是又去翻看源代码核实.但是发现日志打印也是正常的. logger.error(e.getMessage(),e); 这就纳闷了,于是有怀疑是不是日志配置有问题.折腾了一番发现这些配置都没问题…
今天工作中,临时Fix一个bug,一看日志“java.lang.ClassCastException: null”相当懵逼,没有详细堆栈信息,这咋整.虽然根据上下文可以推测代码的大致位置,但不敢拍板确认啊.只好google找一下,在Stackoverflow上果然有解决办法 [解决方法]在java启动命令中添加“-XX:-OmitStackTraceInFastThrow”即可输出详细堆栈信息——亲测可用. [问题原因]如果同一个错误的日志频繁发生,为了性能优化,同时不至于同样的堆栈日志频繁刷入…
JVM 中最重要的一部分就是堆空间了,基本上大多数的线上 JVM 问题都是因为堆空间造成的 OutOfMemoryError.因此掌握 JVM 关于堆空间的参数配置对于排查线上问题非常重要. tips:本文所有配置,如无特别说明,均基于JDK1.8. 堆配置 我们使用 -Xms 设置堆的初始空间大小,使用 -Xmx 设置堆的最大空间大小. java -Xms20m -Xmx30m GCDemo 在上面的命令中,我们设置 JVM 的初始堆大小为 20M,最大堆空间为 30M. 年轻代 在 JDK1…
一.问题场景 使用Logger.error方法时只能打印出异常类型,无法打印出详细的堆栈信息,使得定位问题变得困难和不方便. 二.先放出结论 Logger类下有多个不同的error方法,根据传入参数的个数及类型的不同,自动选择不同的重载方法. 当error(Object obj)只传入一个参数时会将异常对象作为Object使用,并最终当做String打印出来,当使用两个参数error(String message, Throwable t),且第二个参数为Throwable时,才会将完整的异常堆…
一.问题场景 使用Logger.error方法时只能打印出异常类型,无法打印出详细的堆栈信息,使得定位问题变得困难和不方便. 二.先放出结论 Logger类下有多个不同的error方法,根据传入参数的个数及类型的不同,自动选择不同的重载方法. 当error(Object obj)只传入一个参数时会将异常对象作为Object使用,并最终当做String打印出来,当使用两个参数error(String message, Throwable t),且第二个参数为Throwable时,才会将完整的异常堆…
本篇文章基于Java 6(update 21oder 21之后)版本, HotSpot JVM 提供给了两个新的参数,在JVM启动后,在命令行中可以输出所有XX参数和值. -XX:+PrintFlagsFinal and -XX:+PrintFlagsInitial 让我们现在就了解一下新参数的输出.以 -client 作为参数的 -XX:+PrintFlagsFinal   的结果是一个按字母排序的590个参数表格(注意,每个release版本参数的数量会不一样) $ java -client…
周五在公司搭好的ELK上查看日志,组长让看看其中NullPointerException出现很多的原因. 通过NullPointerException搜索,点看其中一个查看,发现异常的信息就一行java.lang.NullPointerException,并没有堆栈信息. 看了几个都没有,然后翻代码看记日志的地方,调用了日志基础工程的一个方法,异常对象通过封装传了进去,其中异常信息属性取值用的是Throwables.getStackTraceAsString(e),这是guava包提供的方法,点…