• 我的异常栈找不到了


    前段时间线上除了个NPE的故障,查询日志的是时候死活找不到对应的异常栈

    只能在日志里找到光秃秃的多行如下的日志:

    xxxxxx:java.lang.NullPointerException
    xxxxxx:java.lang.NullPointerException
    xxxxxx:java.lang.NullPointerException
    xxxxxx:java.lang.NullPointerException

    当时就愤怒,这个哪个XX写的代码为啥try catch后不打印异常栈,这怎么让我查问题原因呢!疯了!

    小技巧,从众多异常中找出有异常栈的那个异常:通常输出到日志里异常栈异常栈前面都会有空格,通过下面语句可以轻松找到有异常栈的哪一个

    cat catalina.out | grep -P -i -A1 --color=always "NullPointerException" | grep -B1 -P "^s"

    止于grep后面各个可选项的含义,那就自己 man grep 查看下吧

    随即就扒代码,发现代码明明写的非常棒

    1 try {
    2      xxx;
    3 } catch (Exception e) {
    4      logger.error("xxxxx, message={}", e.getMessage(), e);
    5 }

    由于出错的代码再出问题时,会自动重试多次,我就找了前几次重试的track查了下,这次有异常栈了!

    是不是很诡异!

    事后查了下谷姐度娘发现这是JVM的内部优化造成的,JVM会认为这个异常栈已经打印了好多了,再打下去,没有任何意思,而且浪费你的磁盘空间。

    JVM是否进行这个优化是有一个JVM参数控制的,可以通过启用这个JVM参数: -XX:-OmitStackTraceInFastThrow 来让JVM忽略这个优化

    复现栗子:

     1 public class TestN {
     2     public static void main(String[] args) {
     3         while (true) {
     4             try {
     5                 testNpe(null);
     6             } catch (Exception e) {
     7                 System.out.print("出问题了:");
     8                 e.printStackTrace();
     9             }
    10         }
    11     }
    12 
    13     private static void testNpe(String str) {
    14         System.out.println(str.toString());
    15     }
    16 }

     参考:https://stackoverflow.com/questions/2411487/nullpointerexception-in-java-with-no-stacktrace

  • 相关阅读:
    JSP学习笔记
    Java之String、StringBuffer、StringBuilder的区别
    Android开发笔记——Handler总结
    深搜_八皇后(HDU_2553)
    广搜_优先队列和记录搜索路径(HDU_1026)
    深搜_素数环(HDU_1016)
    深搜_奇偶减枝(HDU_1010)
    转载 ASP.NET MVC学习之(5):Html.ActionLink
    启动万维网发布服务(W3SVC)
    What is POID
  • 原文地址:https://www.cnblogs.com/halu126/p/7895677.html
Copyright © 2020-2023  润新知