【Arthas】Arthas线上trace匿名函数/Lambda表达式/函数式接口
前言
Arthas是一个非常牛B的东西,我非常喜欢用,特别是在定位线上问题的时候,牛逼大发!
非常建议所有Java玩家都去学习一下
阅读对象
- 了解并使用过Arthas
- 了解并使用过trace命令
先说结论
先说结论,lambda表达式的追踪,大概格式如下:
假设你的lambda表达式写在函数Demo
类的test
方法里面,正常trace
是:trace Demo test
。但如果你的test
方法,里面有lambda表达式,你想要trace
里面的内容,你大概需要这么改:trace Demo lambda$test$0
。
我也不是很理解那个0是啥意思,我猜测是
test
方法内第几个lambda表达式的意思,然后是从0开始
如果你看了结论之后,没办法解决你的问题,那就往下看,仔细看完吧。
RT
RT,我在我的线上环境中遇到了一个问题,问题其实很简单,一眼能看出来。
但重点是,我想使用Arthas去定位线上问题的时候,发现一个很尴尬的点,那就是,简单的trace
,无法trace
到匿名函数里面的执行情况。
大概的伪代码如下:
public void test() {// 从数据库获取数据List<MyReport> reportList = baseMapper.list();// 数据遍历reportList.foreach(p -> {// 在这里面做一系列的运算,代码800行// 但是在这里面出了问题doSomething();});
}
问题
按照上面这种伪代码,如果你trace Demo test
的话,正常来说,它的输出打印类似下面:
`---ts=2023-12-26 11:17:20;thread_name=http-nio-8300-exec-15;id=52;is_daemon=true;priority=5;TCCL=org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader@5b202a3a`---[1699.530527ms] vip.xiaonuo.kitchen.modular.report.service.impl.ReportOrderAnalysisServiceImpl$$EnhancerBySpringCGLIB$$c02dbff3:test() [throws Exception]| +---[0.00% 0.017071ms ] java.util.ArrayList:<init>() #18| +---[0.02% 0.258435ms ] java.util.List:forEach() #19 [throws | `---throw:java.lang.ArithmeticException #-1 [null]`---throw:java.lang.ArithmeticException #-1 [null]
但显然,这个没办法满足我的要求,我想要知道,在foreach
里面,到底是哪一步处理问题。
解决思路(拓展,不感兴趣可以跳过)
于是,我就网上百度:Arthas如何trace 【匿名函数/Lambda表达式/函数式接口】。可惜,都没有理想的方案,甚至说,没有一个人给出了答案。那能怎么办,我只能去看官网了。
话说回来,其实官网也并没有给出一个答案来,不过,在官方github上,我得到了一些灵感。官方说:
总结一下就是:trace本身只能拿到当前method的字节码,所以它只能trace当前method里的 invokevirtual
关键词:method字节码!
所以,我就想着,是否从字节码入手。我印象中,class的字节码,是有【方法】组的
解决办法
解决只需要2步。
步骤一:安装字节码查看插件
首先,需要在Idea安装一个字节码查看插件,jclasslib bytecode viewer
步骤二:查看字节码文件
然后,确保自己的代码已经编译完成的前提下,打开需要查看的Java代码文件
再点击菜单栏的view => show bytecode with Jclasslib
即可打开字节码窗口,接着你会得到如下图所示的文件:
点击方法,你就会查看到,匿名函数在字节码下的命名了。如下:
比如我上图圈红处,我的文件中有一个getOrderAnalysisInfo
方法,并且在里面使用了foreach
,声明了唯一的lambda表达式,所以,可以确定lambda$getOrderAnalysisInfo$0
就是我要的真正的函数。
步骤三:trace匿名函数
这里就不多解释了,把你的trace Demo test
,改成trace Demo lambda$test$0
就好了
当然,我们已经知道了字节码命名风格之后,可以不用安装上面说的字节码插件了,就按照这种命名方式trace
即可。
感谢
感谢百度大佬【作者:程序员子悠】的文章《IDEA 字节码学习查看神器 jclasslib bytecode viewer》
相关文章:

【Arthas】Arthas线上trace匿名函数/Lambda表达式/函数式接口
前言 Arthas是一个非常牛B的东西,我非常喜欢用,特别是在定位线上问题的时候,牛逼大发! 非常建议所有Java玩家都去学习一下 阅读对象 了解并使用过Arthas了解并使用过trace命令 先说结论 先说结论,lambda表达式的追…...
阿里云“块存储”是系统盘和数据盘的意思
阿里云“块存储”是什么意思?块存储是指阿里云服务器的系统盘或数据盘。块存储EBS(Elastic Block Storage)是为云服务器ECS提供的低时延、持久性、高可靠的块级随机存储。块存储支持在可用区内自动复制您的数据,防止意外硬件故障导…...

AI赋能金融创新:ChatGPT引领量化交易新时代
文章目录 一、引言二、ChatGPT与量化交易的融合三、实践应用:ChatGPT在量化交易中的成功案例四、挑战与前景五、结论《AI时代Python量化交易实战:ChatGPT让量化交易插上翅膀》📚→ [当当](http://product.dangdang.com/29658180.html) | [京东…...

数字化时代的探索:学生为何对数据可视化趋之若鹜?
随着信息时代的迅猛发展,数据已经成为我们生活中不可或缺的一部分。而在这个数字化浪潮中,越来越多的学生开始关注数据可视化,这并非偶然。下面,我就从可视化从业者的角度出发,简单聊聊为什么越来越多的学生开始关注数…...
vue2、vue3实现用aws s3协议操作minio进行文件存储和读取
亚马逊s3 API文档 最开始安装了aws-sdk/client-s3,但是不知道为什么一直报错,所以用了aws-sdk 准备工作: 需要已经搭建好minio、创建好桶 1. vue2 安装插件 yarn add aws-sdk s3配置 var AWS require("aws-sdk"); AWS.co…...

宏集应用 | 如何通过振动传感器防止造纸工业中的意外故障?
来源:宏集科技 工业物联网 宏集应用 | 如何通过振动传感器防止造纸工业中的意外故障? 原文链接:https://mp.weixin.qq.com/s/Z2qSdJnPLdOxJuG5qz-JJA 欢迎关注虹科,为您提供最新资讯! 一 应用背景 在造纸工业中&…...
【华为OD题库-110】反转每对括号间的子串-java
题目 给出一个字符串s(仅含有小写英文字母和括号)。 请你按照从括号内到外的顺序,逐层反转每对匹配括号中的字符串,并返回最终的结果。注意,您的结果中不应包含任何括号。 示例1: 输入: s “(abcd)” 输出: “dcba” 示例2: 输入: s “(u(l…...

如何搭建一个高效的Python开发环境
“工欲善其事,必先利其器”,这里我们来搭建一套高效的 Python 开发环境,为后续的数据分析做准备。 关于高效作业,对于需要编写 Python 代码进行数据分析的工作而言,主要涉及两个方面。 1. 一款具备强大的自动完成和错…...
Reactor 和 Proactor模式,IO复用与epoll、同步IO,异步IO与协程
汽车软件中的CPU密集与IO密集任务 在汽车软件中,涉及到ADAS的长期占用CPU的计算任务可以算的上是CPU密集型。 另外的,众多SOA原子服务或者各种数据收集、处理、分发、log系统,应该算是IO密集型任务。 寻求一些手段优化IO性能的原因 在过去…...

nginx反向代理服务器及负载均衡服务配置
一、正向代理与反向代理 正向代理:是一个位于客户端和原始服务器(oricin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户…...
【Log4j2】Log4j2最佳实践:Log4j2配置超过7天压缩,超过3个月删除文件的滚动日志,分别定义info文件和error文件,按照每小时存储
目录 Log4j2配置 springboot多环境日志配置 参考资料 Log4j2配置 如果你想要在控制台输出美化的日志信息,你可以使用Log4j2的ConsoleAppender和AnsiColorConverter来实现。下面是相应的配置示例: <Configuration status"WARN"><…...

windows和Linux如何做强制域名解析
首先我们了解两个问题: 一、域名解析是什么? 域名解析是让我们可以通过网站的域名来找到它对应的IP地址,以便更加方便的访问我们所需访问的网站的一种服务。 它通过DNS服务器来进行,我们输入所想要访问的域名,将会通过…...

5G NTN:通信新天地,卫星通信的奇妙探索
导言 嗨,大家好!今天我们要深入了解一项让通信更强大的技术——5G NTN。它和卫星通信结合在一起,为我们带来了通信的新时代。在这篇文章中,我们将用白话文揭示5G NTN和卫星通信的关系,探索这个通信世界的奇妙之旅。 5…...

RabbitMQ的基础使用
/*** 使用rabbitMQ* 1.引用amqp场景 RabbitAutoConfiguration就会自动生效* 2.给容器中自动配置了各种api RabbitTemplate AmqpAdmin CachingConnectionFactory RabbitMessagingTemplate* 所有属性都是 spring.rabbitmq开头* 3.通过注解EnableRabbit使用* 4.监听消息 使用Rabbi…...
使用Uniapp随手记录知识点
使用uniapp随手记录知识点 1 组件内置组件扩展组件 2 vuex状态管理使用流程mapState 辅助函数gettersMutation 1 组件 内置组件 内置组件内主要包含一些基础的view button video scroll-view等内置基础组件,满足基础场景 扩展组件 扩展组件是uniapp封装了一些成…...
Fiber Node的数据结构,以及如何在Reconciliation阶段被使用。
首先,Fiber Node是React用来描述组件树的数据结构,每一个React组件都对应一个Fiber Node。下面是一个Fiber Node的基本结构: const fiber {// 标识这个Fiber Node的类型(函数组件,类组件,DOM节点类型等&a…...
Spring Cloud Alibaba 之 Sentinel
大家好,我是升仔 引言 在微服务架构中,服务之间的依赖错综复杂。一旦某个服务出现问题,很容易引发连锁反应,导致整个系统瘫痪。Sentinel 就是为了解决这类问题而生的。它通过流量控制、熔断降级等机制,保护服务不被过多…...

Jenkins Tutorial
什么是Jenkins Jenkins是一个自动化平台,它允许你使用pipelines去部署应用。它也可以自动化其他任务。 BUILDTESTDEPLOYMENT Jenkins 架构 首先,你拥有一个Master Server,它控制pipelines和安排Build到你的Agent上; 其次&…...

css mask 案例
文章目录 一、基本用法二、图案遮罩二、文字阴影效果三、日历探照灯效果 CSS的mask属性用于定义一个可重复使用的遮罩,可以将其应用到任何可视元素上。这个功能类似于Photoshop中的图层蒙版。通过mask属性,可以创建独特的效果,比如圆形、渐变…...
案例系列:Movielens_预测用户对电影的评分_基于行为序列Transformer的推荐系统
文章目录 简介数据集设置准备数据下载并准备数据框将电影评分数据转换为序列 定义元数据为训练和评估创建 tf.data.Dataset创建模型输入编码输入特征创建一个二叉搜索树模型运行训练和评估实验结论 描述: 使用行为序列Transformer(BST)模型在…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...

【Linux】自动化构建-Make/Makefile
前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具:make/makfile 1.背景 在一个工程中源文件不计其数,其按类型、功能、模块分别放在若干个目录中,mak…...