时间:2021-05-20
前言
查日志是我们排查问题的重要手段之一,直接又方便。其中异常日志堆栈信息可以让我们快速的发现问题所在,但稍微有点经验的开发应该会遇到过日志堆栈信息丢失的情况。
堆栈只打印了一行:java.lang.NullPointerException,然后什么信息都没有了,这是怎么回事?
如果面试中,就可以提一些问题:
什么情况下Java的异常日志堆栈信息会丢失?其原因是什么? 异常堆栈丢失情况下要如何排查问题?
原因
JVM内部同一个方法被调用多次的时候,会被JIT编译器进行优化,在Oracle官方文档中,有一段英文描述:
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.
在Server模式下的JVM编译器提供了一种方式可以让我们回溯异常的堆栈信息,但是出于性能的因素,当类似的异常抛出多次的时候,异常方法可以被重新编译,重新编译后,编译器会采用更快的策略使用预分配缓存区的异常,并且不再提供堆栈信息。
如果不想使用预分配缓存的异常使用-XX:-OmitStackTraceInFastThrow标记。
另外一方面异常栈的获取是非常消耗性能的,这点通过JVM内部默认会对一些异常不进行堆栈回溯也可以看出。
异常丢失如何排查
验证堆栈丢失Demo
public class ExceptionLossDemo { public static void main(String[] args) { boolean flag = false; for (int i = 0;;i++){ boolean isExceptionStackLoss = exceptionTest(); if (isExceptionStackLoss) { flag = true; System.out.println("times:" + i + ", res:" + isExceptionStackLoss); } else if (flag) { System.out.println("times:" + i + ", res:" + isExceptionStackLoss); } } } public static boolean exceptionTest() { try { // 构造一个NPE异常 int res = ((Integer)null) + 1; } catch (Exception e) { if (e.getStackTrace().length == 0) { // 打印堆栈信息 e.printStackTrace(); try { // 当出现 NPE 异常堆栈为空的时候,停留5秒,便于观察 Thread.sleep(5000); } catch (Exception e1) { } // 如果出现 NPE 异常堆栈为空,返回true return true; } // 打印堆栈信息 e.printStackTrace(); } return false; }}最后
希望对大家有所帮助,技术不断精进..
到此这篇关于Java异常日志堆栈丢失的原因与排查的文章就介绍到这了,更多相关Java异常日志堆栈丢失内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文研究的主要是log4j不打印异常堆栈的相关内容,具体如下。最近在线上系统的错误日志中发现了一个现象:代码里用log4j打印系统运行时异常堆栈信息,在错误日志
将tryexcept中捕获到的异常信息输出到日志文件中,方便查找错误原因,tranceback模块提供了把详细出错堆栈信息格式化成字符串返回函数format_e
我们给大家通过实例代码分析了java异常栈的函数用法并在下面给大家整理了Java获取异常堆栈信息的两种方法,以下是全部内容:(stacktrace)异常栈轨迹是
1、问题现象业务进程(用户态多线程程序)挂死,操作系统反应迟钝,系统日志没有任何异常。从进程的内核态堆栈看,看似所有线程都卡在了内核态的如下堆栈流程中:[roo
PostgreSQL错误日志与慢查询日志对于线上系统分析、问题预警、问题排查起到非常重要的作用,在此不做赘述。此文档记录错误日志与慢查询日志的收集、分析与存储展