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。
  • 相关阅读:
    Powershell数据处理
    Powershell About Active Directory Group Membership of a domain user
    Powershell About Active Directory Server
    Oracle Schema Objects——Tables——TableStorage
    Oracle Schema Objects——Tables——TableType
    English Grammar
    Oracle Database Documentation
    Oracle Schema Objects——Tables——Oracle Data Types
    Oracle Schema Objects——Tables——Overview of Tables
    What is Grammar?
  • 原文地址:https://www.cnblogs.com/liushijie/p/5446347.html
Copyright © 2011-2022 走看看