zoukankan      html  css  js  c++  java
  • JVM参数OmitStackTraceInFastThrow:不打印NullPointerException异常堆栈

    查看线上日志,遇到一个诡异的问题,就是系统大量空指针的异常,但是没有打印堆栈,导致不方便定位问题。
    经过一番代码调试,确定并非程序代码问题。没有线索之后,从Google找到了答案:是因为在server模式下运行的时候,有一个默认选项是-XX:+OmitStackTraceInFastThrow,这个玩意的意思就是当大量抛出同样的异常的后,后面的异常输出将不打印堆栈,打印堆栈的时候底层会调用到Throwable.getOurStackTrace()方法,而这个方法是synchronized的,对性能有比较明显对影响。所以这个参数是合理的。正常情况下,如果打印了几万条异常堆栈是很容易发现问题的。但是我们的系统正好赶上访问量高峰,一不留神就错过打印详细堆栈的阶段了。

    复现测试代码:

    public class NullPointExceptionTest {
        static final Logger logger = LoggerFactory.getLogger(NullPointExceptionTest.class);
        public static void main(String[] args) {
            String test = null;
            int i = 0;
            while (true) {
                try {
                    test.length();
                } catch (Exception e) {
                    System.out.println(i++ + " - " + e.getStackTrace().length);
                    if (e.getStackTrace().length == 0) {
                        logger.error("e is", e);
                        break;
                    }
                }
            }
        }
    }
    

    知道原因后,那我们的解决办法可以有:

    1. 历史数据还在的话,下载历史数据查看;
    2. 重新启动服务器,再观察日志;
    3. 设置JVM参数,暂时禁止掉这个优化选项:-XX:+OmitStackTraceInFastThrow。
  • 相关阅读:
    MOSS项目开发 周记(第十四周)
    MOSS项目开发 周记(第十七周)
    MOSS项目开发 周记(第十一周)
    MOSS项目开发 周记(第九周)
    MOSS项目开发 周记(第十三周)
    MOSS项目开发 周记(第十周)
    MOSS项目开发 周记(第十二周)
    MOSS项目开发 周记(第十六周)
    php中echo(),print(),print_r()的区别
    11个有用的移动网页开发App和HTML5框架
  • 原文地址:https://www.cnblogs.com/liushijie/p/5446347.html
Copyright © 2011-2022 走看看