遇事不决,阿尔萨斯(Arthas)

2024-05-10 04:36

本文主要是介绍遇事不决,阿尔萨斯(Arthas),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

      • 一、cat log.log | grep 流水号 引发的惨案
      • 二、Collections.sort排序long型强转int型引发的惨案

一、cat log.log | grep 流水号 引发的惨案

接口报错,查看日志是空指针,但是没有详细的报错信息。
在这里插入图片描述以为是日志打印格式的问题,遂改变了打印格式,发现还是没有详细错误信息。

网上搜索后推荐JVM参数加上-XX:-OmitStackTraceInFastThrow。

觉得动JVM参数不太放心,于是想到了Arthas工具。

寻找arthas的路径:locate arthas-boot.jar

进入对应服务的docker容器内部:docker exec -it pid /bin/bash

然后进入到arthas 的jar包目录,启动arthas java -jar arthas-boot.jar
选择进程(输入[]内编号(不是PID)回车),一般情况就只有一个,输入1即可

trace 命令能渲染和统计整个调用链路上的所有性能开销和追踪调用链路。

trace

使用trace命令查看方法内部每个方法的耗时 trace demo.Test queryUpgradeOffer
除了显示方法的耗时,还会显示是在哪个方法抛出了异常。找到是在convert2QueryOfferListRequest抛出了异常

继续使用trace命令查看convert2QueryOfferListRequest方法执行的耗时 trace demo.Test convert2QueryOfferListRequest
然后就能看到是在哪一行抛出了异常

通过排查代码发现是写错了map的key,导致值不存在抛出了空指针。

然后测试同事在群里发了一张截图,我看到了详细的堆栈信息,整个人瞬间不好了

忽然想起来了grep 的 -A -B -C三个参数

然后cat log.log | grep 流水号 -A 5 果然显示出了完整的堆栈信息。

二、Collections.sort排序long型强转int型引发的惨案

怪事天天有,今天特别多。

测试说我返回的数据顺序反了,我仔细差了一下代码,确认是写了排序,还是逆序,但是返回的结果就是正序,奇了怪了。

遇事不决,阿尔萨斯!

watch命令能观察到指定函数的调用情况。能观察到的范围为:返回值、抛出异常、入参

watch

使用watch命令查看一下排序方法的参数和返回值,以及方法执行前后参数的变化
watch demo.Test calcRemainderTime “{params,returnObj}” -x 4 -b -s -n 4

发现排序后确实是逆序了,那问题确实出在排序方法上!

看了一下排序方法,确认是逆序,那就只可能是long型强转int型,精度丢失导致排序异常。

写个demo校验一下猜想。

public class SortTest {public static void main(String[] args) {List<Student> list = new ArrayList<>();Student student1 = new Student(18,1722095999999L);Student student2 = new Student(19,1711468799999L);Student student3 = new Student(12,1709567999999L);Student student4 = new Student(18,1708567999999L);list.add(student1);list.add(student3);list.add(student2);list.add(student4);
//        Collections.sort(list,(o1,o2)->o2.getAge()-o1.getAge());Collections.sort(list,(o1,o2)->(int)(o2.getTime()-o1.getTime()));for (Student student : list) {System.out.println(student.getTime());}System.out.println("================第二次排序====================");Collections.sort(list,(o1,o2)->{if(o2.getTime()>o1.getTime()){return 1;}else if(o2.getTime()<o1.getTime()){return -1;}else {return 0;}});for (Student student : list) {System.out.println(student.getTime());}}static class Student{private int age;private long time;public int getAge() {return age;}public void setAge(int age) {this.age = age;}public long getTime() {return time;}public void setTime(long time) {this.time = time;}public Student(int age, long time) {this.age = age;this.time = time;}}
}

执行结果如下

1711468799999
1709567999999
1722095999999
================第二次排序====================
1722095999999
1711468799999
1709567999999
1708567999999

确实是long型强转int型导致的排序异常,而测试的正序可能恰好是一个巧合。

故:排序时如果排序字段不是int型,不能强转成int型,精度丢失后排序会异常。

这篇关于遇事不决,阿尔萨斯(Arthas)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/975450

相关文章

Arthas问题排查工具

简介 Arthas 是Alibaba开源的Java诊断工具,动态跟踪Java代码;实时监控JVM状态,可以在不中断程序执行的情况下轻松完成JVM相关问题排查工作 。支持JDK 6+,支持Linux/Mac/Windows。这个工具真的很好用,而且入门超简单,十分推荐。 使用场景 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?我改的代码为什么没有执行到?难道是我没

Arthas工具使用,分析线上问题好帮手

在K8S中的步骤: #1.进入node #2.下载arthas 在容器中下载并启动 Arthas: java -jar arthas-boot.jar --repo-mirror aliyun --use-http #3.找到出现问题的类和方法的绝对路径 类路径 方法 #4.执行trace命令或者watch命令 trace:命令会追踪方法的执行轨迹,并在 n 次调用后返回跟踪信息

arthas使用分享

文章目录 准备启动Demo进入arthas控制台基础命令jvm相关class/classloader相关monitor/watch/trace相关options管道后台异步任务Web Console其他特性 准备 此文章目的不是为了解释什么,就是为了以后使用命令的时候有一个直观的感受 https://github.com/alibaba/arthas https://aliba

java性能监控利器Arthas

引言 性能调优是一个非常复杂,技术含量很高的高作,涉及到的知识面很广,而性能调优的第一步工作就是发现问题和定位问题,确定性能问题出现在那一部分,需要定位到具体的函数,类,SQL,某些参数的配置等等。那么我们在实际工作中怎么定位问题呢?肯定不能靠猜测和想象,尤其是我们线上出现了一些不是很容易复现的性能问题时。比较专业的开发人员肯定是会借助一些工具,以JAVA语言来说,如jdk自带的jvisualv

简明的Arthas故障排查实践

写在文章开头 Arthas是一款强大的开源Java诊断程序,它可以非常方便的启动并以界面式的方式和Java程序进行交互,支持监控程序的内存使用情况、线程信息、gc情况、甚至可以反编译并修改现上代码等。所以它成为笔者进行线上问题排查的重要手段,而本文将从实际使用的角度介绍一下arthas的基本使用技巧,希望对你有帮助。 Hi,我是 sharkChili ,是个不断在硬核技术上作死的 java

arthas源码刨析:启动 (1)

文章目录 arthas-bootBootstrap Created with Raphaël 2.3.0 开始 检查监听端口 jps 列表java应用 下载 lib 依赖 功能移交给 arthas-core 结束 arthas-boot 该module 的代码只有3个类

阿里性能诊断利器Arthas

1、介绍 Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱。 当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?线上遇到某个用户的数据处理有问题,但线上同

牛叉了-arthas 热更新 mybatis mapper xml

测试环境能够热更新class 能否热更新mapper xml? arthas 群有同学提了这样的一个需求,必须满足满足 arthas-idea-plugin 2.8 版本 https://plugins.jetbrains.com/plugin/13581-arthas-idea 1、基本思路 1.1 流程图 1.2 实现效果 echo `redis-cli -h '127.0.0

arthas 获取spring被代理的目标对象

背景 记得一次问题排查,通过ognl 获取到 spring aop 代理过的cglib 代理对象的原始对象获取问题,spring的静态static spring context 进行调用获取被代理的目标对象的问题,记得当事是通过内部的一个工具 代理对象中被代理的目标对象 类似这个方法,通过静态的方法进行调用.挺方便的,但是这个方法比较麻烦,不是所有的工程都有这个方法,如何通过工具化让大家都能使用

arthas 火焰图神器-async-profiler

一、async-profiler This project is a low overhead sampling profiler for Java that does not suffer from Safepoint bias problem. It features HotSpot-specific APIs to collect stack traces and to track mem