问题与分析

最近在查项目的log时发现报了大量的NPE(NullPointerException),诡异的是只log了Exception的类名,却没有具体的堆栈信息,以致于无法对该NPE异常进行准确定位。

这是因为jvm自身存在着优化机制,但一个同样的异常重复出现并被打印到log后,jvm可以不提供具体的堆栈信息来提高性能。关于这个的具体信息我们可以从官网上查到相关的资料:

http://www.oracle.com/technetwork/java/javase/relnotes-139183.html#vm

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.

谷歌翻译如下:

服务器VM中的编译器现在为所有“冷”内置异常提供正确的堆栈回溯。出于性能目的,当抛出这样的异常几次时,可以重新编译该方法。重新编译之后,编译器可以使用不提供堆栈跟踪的预分配异常来选择更快的策略。要完全禁用预分配的异常,请使用以下新标志:-XX:-OmitStackTraceInFastThrow。

解决方案

有两个解决方案,第一个是安装官网说的,可以通过设置jvm的启动参数来关闭该策略:

-XX:-OmitStackTraceInFastThrow

另一个解决方案是不设置启动参数,直接重新启动服务器,比如Tomcat。重启服务器时jvm被重新启动,这样再遇到同样的Exception时就会打印出来,当然如果后续如果重复遇到同样的Exception还是无法打印出具体的异常栈信息。

当时我是选择了后者这个方案,因为如果启用了该参数会导致log日志太过庞大,也降低了性能,直接重启服务器,并快速定位bug以便于解决问题。

补充

如果想了解更多关于该参数的细节,可以参考下边的文章:

log日志中不打印异常栈的具体信息的更多相关文章

  1. rest-assured 将log()中的信息打印到log日志中去的方法

    rest-assured 将log()中的信息打印到log日志中去的方法: ============方法1============== PrintStream fileOutPutStream = n ...

  2. 数据库 alert.log 日志中出现 "[Oracle][ODBC SQL Server Wire Protocol driver][SQL Server] 'RECOVER'"报错信息

    现象描述: (1).数据库通过调用透明网络实现分布式事务,但透明网关停用后,失败的分布式事务并未清理. (2).数据库 alert 日志 Thu Sep 06 06:53:00 2018 Errors ...

  3. 删除log日志中包含某个字符的行

    sed -i '/{Str}/d' abc.txt 假如你的log日志中某行有sleep字符,直接输入命令: sed -i '/sleep/d' log.log 如果删除的是一个变量的值,假如是var ...

  4. 在日志中记录Java异常信息的正确姿势

    遇到的问题 今天遇到一个线上的BUG,在执行表单提交时失败,但是从程序日志中看不到任何异常信息. 在Review源代码时发现,当catch到异常时只是输出了e.getMessage(),如下所示: l ...

  5. 记-统计svn与git的log日志中的代码行变更

    任务要求 统计指定时间内,指定git地址与svn地址上的所有人员的代码行变更情况. 解决方案 最初为根据数据库中存储的所有git与svn地址来统计所有人员的提交代码行.之后由于库中存储的地址不全,改为 ...

  6. Linux日志中如何查找关键字及其前后的信息

    在日常工作中,我们经常需要查看日志,比如可以通过 tail 命令实时查看日志,也可以通过 cat 等命令查看日志信息. 但现在我们要讨论的是,如何从日志中通过关键字过滤出我们想要的内容,方法有多种,今 ...

  7. Mybatis中在log日志或控制台打印执行的sql

    最近在调试代码时,需要查看当前操作执行的sql,在日志里没查到,经过修改logback配置后成功,现记录如下:一.Mybatis版本是3.0.6(我正在用的版本)该版本只需要修改logback.xml ...

  8. jvm不打印异常栈

    生产环境抛异常,但却没有将堆栈信息输出到日志,确认打印日志方法正确logger.error("somthing error", ex); JVM启动参数加上-XX:-OmitSta ...

  9. mycat的wrapper.log日志中发现主从切换报错

    可能是MySQL在某些情况下重启(密切关注重启现象,关注日志,找出原因),导致mycat切换主从.由于设置了单向主从,mycat将从库切换为主库,原来的主库宕机.后来重新更新dnindex.conf之 ...

随机推荐

  1. ABAP内存运用

    (1)ABAP 内存运用语句: EXPORT  LT_ITAB  TO MEMORY  ID ‘MM’. IMOIRT   LT_ITTAB FROM MEMORY  ID ‘MM’. (2)SAP内 ...

  2. Ace(一)环境搭建

    1.下载ACE源码代码    http://www.cs.wustl.edu/~schmidt/ACE.html 2.编译源代码    2.1 进入源码包解压后的ACE_wrappers\ace目录, ...

  3. 关于JavaScript的事件触发

    突然知道JavaScript底层是怎么实现事件触发的,找到一个博客,功力不够,看的很迷糊,记载这里吧,后面再研究. [探讨]javascript事件机制底层实现原理

  4. WebDriver API——浏览器控制暨如何学习webdriver API

    在测试过程中我们可能需要对浏览器进行控制,大小控制啊,刷新页面啊,前进后退等等,最常用的两个接口是window和Navigation. 我们最常用的就是这4个,那么你是否感兴趣它们后面是什么,它们是怎 ...

  5. HTML页面下雪特效

    1. [代码][HTML]代码     <a  href="javascript:void(function(){var d = document,a = 'setAttribute' ...

  6. Floyd算法(弗洛伊德算法) 百度百科

    核心代码 for(int k=1; k<=NODE; ++k)//对于每一个中转点 for(int i=0; i<=NODE; ++i)//枚举源点 for(int j=0; j<= ...

  7. 使用 WinSCP(下载) 上文件到 Linux图文教程

        问题导读: 1.如何远程链接? 2.如何上传文件? 3.如何对立面的文件进行操作? 4.什么情况下会链接失败? https://yunpan.cn/cYWtNMycjeVPv 访问密码 4f7 ...

  8. @PathVariable @RequestParam @RequestHeader @CookieValue POJO Servlet API

  9. java并发之阻塞队列LinkedBlockingQueue与ArrayBlockingQueue

    Java中阻塞队列接口BlockingQueue继承自Queue接口,并提供put.take阻塞方法.两个主要的阻塞类实现是ArrayBlockingQueue和LinkedBlockingQueue ...

  10. jquery data 选择器 表格序列化serialize()

    data()在元素上存放或者读取数据,返回jquery对象. demo: <div data-obj="{'name':'zhangsan','age':20}">&l ...