如何从消失的异常堆栈定位线上问题

news2024/9/24 19:18:17

一、消失的异常堆栈

如何快速定位问题?想必大家心中都有自己的答案,当然最简单直接的办法还是查找异常堆栈信息。

然而有时异常堆栈并不完整,只有一句描述,如下:

Caused by: java.lang.NullPointerException

造成这种现象的原因其实很简单,原因如下:

JIT编译器对异常进行了优化,当代码中的某个位置抛出同一个异常很多次后,
JIT服务端编译器(C2)会将其优化成抛出一个事先编译好的、类型匹配的异常,异常堆栈信息就看不到了。

二、Fast Throw

Fast Throw,字段上理解就是快速抛异常,目前需要满足以下条件才有如此的优化:

•只针对HotSpot VM才有, 例如oracleJDK, libericaJDK等

•特定位置抛出很多次,其实就是JIT将它优化了

•JIT必须使用C2才会这样优化,不抛出原来的异常,改用fast throw抛出

•这是一个事先分配好的异常,message和堆栈都是空的

可以看出,如果某个异常在同一位置被抛出多次,会被JIT C2优化成空异常,例如本文的NullPointerException,既没有message,也没有堆栈.但他的速度非常快,不用分配内存和获取堆栈.

如果想关闭这个优化,设置-XX:-OmitStackTraceInFastThrow即可。

存在即合理,既然存在fast throw的优化,必然有其价值。fast throw优化的原因是为了提高性能。当同一种异常在相同的位置被抛出多次,编译器就会重新编译此方法。重编译后,编译器可能会使用不提供跟踪的预分配异常来选择更快的策略。

本地测试了一下抛出NullPointerException,在开启与关闭fast throw的性能。

执行次数开启Fast Throw关闭Fast Throw
10w996ms3525ms
100w5983ms28345ms
500w35678ms——

言而简之,不能因此出现了消失的异常堆栈就尝试关闭fast throw优化功能。

三、问题原因定位

对于线上环境中触发了Fast Throw机制,则可以通过向前追溯相同的日志来定位问题。

如在开门红中,有个接口的可用率调到98.3%(不是100%),如下图。

然后搜索日志发现大量的Caused by: java.lang.NullPointerException,没有详细的异常堆栈,很显然是由于fast throw导致的,然后不断向前追溯相同的日志来定位问题如下图。

出现问题的原因找到了,接着就分析原因。原因很简单,由于某一台机器性能波动导致接口超时将兜底对象缓存,后续逻辑在处理的过种中对象中的Boolean属性值在转boolean时出现NPE,问题根源还是代码兼容性不足够好。



 

这这台机器进行系统视图层分析,发现TCP重传数较高,如下左图。





四、问题原因分析

TCP重传主要是为了保证数据传输的可靠性,TCP是一种保证可靠传输的机制,如重传与确认机制、数据校验、数据分片、流量控制、拥塞控制等。TCP重传的类型有超时重传和快速重传。超时重传是在请求包发送出去时开启计时器,当到达时间之后,没有收到ACK,则进行重传直到达到上限次数或者收到ACK。快速重传则依赖于数据包的期望序列号,并进行一致性检查。

•多台机器或者同一机房同时TCP重传

很大原因是网络抖动

•单机或者某个应用出现TCP重传

一般是由于链路的服务器或端口无法访问,对于虚拟机或者docker,还需要考虑宿主机的问题。

通过系统级分析,最后确定是由于宿主机连接性问题导致docker实例TCP重传增高,当然最重要的是补充相关的指标监控。

 总之,在遇到问题时,要从根源上分析问题。











本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/610998.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

显存容量一键翻倍性能暴涨,N卡遗留漏洞被破解了

2K、4K 高分辨率的普及,加上游戏特效进步复苏,显存容量的需求也提升了一个台阶。 经过测试,某些游戏最大显存占用已经超出 12GB ,即便 1080P 也占用不低。 再到生产力、AI ,显存就更容易爆炸。 显存这玩意不像内存可以…

通用文字识别OCR 之实现数字化教材

引言 通用文字 OCR 识别 API 是一种功能强大的服务,可用于多场景、多语种的整图文字检测和识别,通过将OCR技术应用于学校环境,可以实现教育资源的数字化和学习过程的自动化。 本文将探讨通用文字识别OCR 在学校的实际应用,希望对…

linux进阶 --- 环境搭建、单一执行、循环执行

环境搭建 操作环境 : 创建完虚拟机,安装命令行界面的linux操作系统(centos8,rocky8,rhel8)为服务器配置白名单和安全组 :vim /etc/selinux/config,selinuxdisabled(getenforce&…

chatgpt赋能python:Python图片处理教程

Python 图片处理教程 Python 是一种功能强大的编程语言,广泛应用于大量不同的行业和领域。其中之一是图像处理和分析。Python 提供了一个庞大的图像库,其拥有大量的工具和函数。Python 图像库具有高度的可扩展性,可以很容易地将其与其他库集…

图解LeetCode——199. 二叉树的右视图

一、题目 给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。 二、示例 2.1> 示例 1: 【输入】 [1,2,3,null,5,null,4] 【输出】 [1,3,4] 2.2> 示例 2: 【输入】 [1,null,3] …

ipad笔买原装还是平替?苹果平替电容笔推荐

我认为苹果的电容笔跟一般的电容笔最大的不同就是,苹果原装电容笔有一种特殊的重力压感,可以让我们在纸上感受到最真实的线条粗细变化,用来作画再合适不过了。这是市场上普通电容笔所不具备的功能特性。除了这些,这两款电容笔在写…

【启扬方案】助力智能制造,MES系统解决方案

近年来,智能制造席卷全球,越来越多的制造企业开始采用智能化的生产制造方式,智能工厂作为智能制造的核心之一,成为了制造业发展的重要趋势之一。然而,要实现智能工厂的建设,需涵盖从生产计划、生产调度到生…

安卓调试|入门扫盲必备adb调试工具介绍、安装使用说明

欢迎关注「全栈工程师修炼指南」公众号 点击 👇 下方卡片 即可关注我哟! 设为「星标⭐」每天带你 基础入门 到 进阶实践 再到 放弃学习! “ 花开堪折直须折,莫待无花空折枝。 ” 作者主页:[ https://www.weiyigeek.top ] 博客&…

11 Redis大厂真实需求落地案例实战

案例实战:微信抢红包 需求分析 各种节假日,发红包抢红包,不说了,100%高并发业务要求,不能用mysql来做一个总的大红包,会有可能拆分成多个小红包,总金额 分金额1分金额2分金额3…分金额N每个人…

【Python编程从入门到实践第一版】P1 变量的命名规则

变量的命名规则 在python中使用变量时,需要遵守一些规则: 变量名只能包含字母、数字和下划线;变量名不能以数字开头,但是可以以字母后者下划线开头;变量名不能包含空格;Python关键字以及函数名不能用作变量…

2.3 基于reactor的HTTP服务器实现

目录 一、基于reactor的HTTP服务器实现二、实现按行读取三、HTTP服务器的收—实现requets函数四、HTTP服务器的发—实现response函数方法之一:open and read五、HTTP服务器的发—实现response函数方法之二:sendfile()1、sendfile函数2、实现3、结果展示 …

面对数据量大的情况如何进行优化?

前后端如何实现 前端展示的优化后端算法的支持1. 分治算法简介基本步骤关键点举例总结 2. 哈希算法简介特点应用 3. 位图(BitMap )算法简介实现步骤 4. 布隆过滤器(Bloom Filter)简介工作流程总结 5. 堆排序工作流程总结 前端展示…

港联证券|A股中长期投资价值显现

种种迹象显示,近期A股市场底部特征愈加明显。业内人士指出,当前市场已进入价值投资区域。而从中长期来看,中国经济的复苏前景和高质量发展趋势,为中国资本市场的长期投资价值奠定了基础。 底部特征浮现 2023年以来,A股…

【云原生】Docker网络原理及数据卷、书卷容器、容器互联

docker网络模式的特性 docker初始状态下有三种默认的网络模式 ,bridg(桥接),host(主机),none(无网络设置) docker network ls 网络模式配置说明host//主机模式–networ…

linuxOPS基础_使用客户端连接linux

ssh概念及其工作流程 ssh概念及其工作流程—>跳转 常用SSH终端工具 SecureCRT 官网:www.vandyke.com SecureCRT是一款支持SSH(SSH1和SSH2)的终端仿真程序,简单地说是Windows下登录UNIX或Linux服务器主机的软件。 XShell 官网:www.ne…

【SpringMVC学习】SSM整合

文章目录 配置准备1. 新建工程项目2. 引入配置文件配置config 功能模块开发数据库与POJO配置Dao和Service和Controller的配置测试接口功能 配置准备 1. 新建工程项目 使用webapp模版生成maven项目 配置相关文件功能 2. 引入配置文件配置config pom.xml <?xml version…

word文件加密怎么操作?1分钟就可以轻松实现!

案例&#xff1a;我经常使用word文章整理一些资料&#xff0c;有些资料比较重要&#xff0c;我不希望别人可以随意打开它。听说可以对word文档进行加密&#xff0c;具体应该怎么操作&#xff1f; 随着数字化时代的到来&#xff0c;电子文档在我们的日常生活和工作中扮演着越来…

chatgpt赋能python:Python噪音数据处理:一个有效的解决方案

Python噪音数据处理&#xff1a;一个有效的解决方案 Python作为一种强大的编程语言&#xff0c;在数据处理领域有着广泛的应用。可以用Python来处理许多不同类型的数据&#xff0c;其中包括噪音数据。噪音数据通常被定义为意外的或不需要的信号&#xff0c;这些信号可能会影响…

创业第一步:如何写好商业计划书

即使你的项目不需要融资&#xff0c;你也把标准商业计划书作为一个工具模板来应用&#xff0c;帮助更全面的盘点你要做的事情。 撰写一份性感的商业计划书如同造房子&#xff1a;第一步是科学设计&#xff0c;打好结构&#xff08;有清晰的撰写逻辑&#xff09;&#xff1b;第…

std::remove cannot convert ‘std::vector<std::__cxx11::basic_string<char> >:: 报错

最近遇到一个非常奇怪C++的问题: vector<string> tmp;tmp.erase(std::remove(tmp.begin(), tmp.end(), Routers[i].name_), tmp.end());在Windows下的VS中编译没有任何问题。 但是在Linux 下的 g++下面报错: 解决方法,包含头文件: #include <algorithm&g…