当前位置: 首页 > news >正文

【Arthas】Arthas线上trace匿名函数/Lambda表达式/函数式接口

前言

Arthas是一个非常牛B的东西,我非常喜欢用,特别是在定位线上问题的时候,牛逼大发!
非常建议所有Java玩家都去学习一下

阅读对象

  1. 了解并使用过Arthas
  2. 了解并使用过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,再深层的invokevirtual,它并不能知道。
总结一下就是: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的东西&#xff0c;我非常喜欢用&#xff0c;特别是在定位线上问题的时候&#xff0c;牛逼大发&#xff01; 非常建议所有Java玩家都去学习一下 阅读对象 了解并使用过Arthas了解并使用过trace命令 先说结论 先说结论&#xff0c;lambda表达式的追…...

阿里云“块存储”是系统盘和数据盘的意思

阿里云“块存储”是什么意思&#xff1f;块存储是指阿里云服务器的系统盘或数据盘。块存储EBS&#xff08;Elastic Block Storage&#xff09;是为云服务器ECS提供的低时延、持久性、高可靠的块级随机存储。块存储支持在可用区内自动复制您的数据&#xff0c;防止意外硬件故障导…...

AI赋能金融创新:ChatGPT引领量化交易新时代

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

数字化时代的探索:学生为何对数据可视化趋之若鹜?

随着信息时代的迅猛发展&#xff0c;数据已经成为我们生活中不可或缺的一部分。而在这个数字化浪潮中&#xff0c;越来越多的学生开始关注数据可视化&#xff0c;这并非偶然。下面&#xff0c;我就从可视化从业者的角度出发&#xff0c;简单聊聊为什么越来越多的学生开始关注数…...

vue2、vue3实现用aws s3协议操作minio进行文件存储和读取

亚马逊s3 API文档 最开始安装了aws-sdk/client-s3&#xff0c;但是不知道为什么一直报错&#xff0c;所以用了aws-sdk 准备工作&#xff1a; 需要已经搭建好minio、创建好桶 1. vue2 安装插件 yarn add aws-sdk s3配置 var AWS require("aws-sdk"); AWS.co…...

宏集应用 | 如何通过振动传感器防止造纸工业中的意外故障?

来源&#xff1a;宏集科技 工业物联网 宏集应用 | 如何通过振动传感器防止造纸工业中的意外故障&#xff1f; 原文链接&#xff1a;https://mp.weixin.qq.com/s/Z2qSdJnPLdOxJuG5qz-JJA 欢迎关注虹科&#xff0c;为您提供最新资讯&#xff01; 一 应用背景 在造纸工业中&…...

【华为OD题库-110】反转每对括号间的子串-java

题目 给出一个字符串s(仅含有小写英文字母和括号)。 请你按照从括号内到外的顺序&#xff0c;逐层反转每对匹配括号中的字符串&#xff0c;并返回最终的结果。注意&#xff0c;您的结果中不应包含任何括号。 示例1: 输入: s “(abcd)” 输出: “dcba” 示例2: 输入: s “(u(l…...

如何搭建一个高效的Python开发环境

“工欲善其事&#xff0c;必先利其器”&#xff0c;这里我们来搭建一套高效的 Python 开发环境&#xff0c;为后续的数据分析做准备。 关于高效作业&#xff0c;对于需要编写 Python 代码进行数据分析的工作而言&#xff0c;主要涉及两个方面。 1. 一款具备强大的自动完成和错…...

Reactor 和 Proactor模式,IO复用与epoll、同步IO,异步IO与协程

汽车软件中的CPU密集与IO密集任务 在汽车软件中&#xff0c;涉及到ADAS的长期占用CPU的计算任务可以算的上是CPU密集型。 另外的&#xff0c;众多SOA原子服务或者各种数据收集、处理、分发、log系统&#xff0c;应该算是IO密集型任务。 寻求一些手段优化IO性能的原因 在过去…...

nginx反向代理服务器及负载均衡服务配置

一、正向代理与反向代理 正向代理&#xff1a;是一个位于客户端和原始服务器(oricin server)之间的服务器&#xff0c;为了从原始服务器取得内容&#xff0c;客户端向代理发送一个请求并指定目标(原始服务器)&#xff0c;然后代理向原始服务器转交请求并将获得的内容返回给客户…...

【Log4j2】Log4j2最佳实践:Log4j2配置超过7天压缩,超过3个月删除文件的滚动日志,分别定义info文件和error文件,按照每小时存储

目录 Log4j2配置 springboot多环境日志配置 参考资料 Log4j2配置 如果你想要在控制台输出美化的日志信息&#xff0c;你可以使用Log4j2的ConsoleAppender和AnsiColorConverter来实现。下面是相应的配置示例&#xff1a; <Configuration status"WARN"><…...

windows和Linux如何做强制域名解析

首先我们了解两个问题&#xff1a; 一、域名解析是什么&#xff1f; 域名解析是让我们可以通过网站的域名来找到它对应的IP地址&#xff0c;以便更加方便的访问我们所需访问的网站的一种服务。 它通过DNS服务器来进行&#xff0c;我们输入所想要访问的域名&#xff0c;将会通过…...

5G NTN:通信新天地,卫星通信的奇妙探索

导言 嗨&#xff0c;大家好&#xff01;今天我们要深入了解一项让通信更强大的技术——5G NTN。它和卫星通信结合在一起&#xff0c;为我们带来了通信的新时代。在这篇文章中&#xff0c;我们将用白话文揭示5G NTN和卫星通信的关系&#xff0c;探索这个通信世界的奇妙之旅。 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等内置基础组件&#xff0c;满足基础场景 扩展组件 扩展组件是uniapp封装了一些成…...

Fiber Node的数据结构,以及如何在Reconciliation阶段被使用。

首先&#xff0c;Fiber Node是React用来描述组件树的数据结构&#xff0c;每一个React组件都对应一个Fiber Node。下面是一个Fiber Node的基本结构&#xff1a; const fiber {// 标识这个Fiber Node的类型&#xff08;函数组件&#xff0c;类组件&#xff0c;DOM节点类型等&a…...

Spring Cloud Alibaba 之 Sentinel

大家好&#xff0c;我是升仔 引言 在微服务架构中&#xff0c;服务之间的依赖错综复杂。一旦某个服务出现问题&#xff0c;很容易引发连锁反应&#xff0c;导致整个系统瘫痪。Sentinel 就是为了解决这类问题而生的。它通过流量控制、熔断降级等机制&#xff0c;保护服务不被过多…...

Jenkins Tutorial

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

css mask 案例

文章目录 一、基本用法二、图案遮罩二、文字阴影效果三、日历探照灯效果 CSS的mask属性用于定义一个可重复使用的遮罩&#xff0c;可以将其应用到任何可视元素上。这个功能类似于Photoshop中的图层蒙版。通过mask属性&#xff0c;可以创建独特的效果&#xff0c;比如圆形、渐变…...

案例系列:Movielens_预测用户对电影的评分_基于行为序列Transformer的推荐系统

文章目录 简介数据集设置准备数据下载并准备数据框将电影评分数据转换为序列 定义元数据为训练和评估创建 tf.data.Dataset创建模型输入编码输入特征创建一个二叉搜索树模型运行训练和评估实验结论 描述&#xff1a; 使用行为序列Transformer&#xff08;BST&#xff09;模型在…...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用&#xff0c;因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型&#xff08;VLMs&#xff09;在字幕生成方面…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论

路径问题的革命性重构&#xff1a;基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中&#xff08;图1&#xff09;&#xff1a; mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...

LLMs 系列实操科普(1)

写在前面&#xff1a; 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容&#xff0c;原视频时长 ~130 分钟&#xff0c;以实操演示主流的一些 LLMs 的使用&#xff0c;由于涉及到实操&#xff0c;实际上并不适合以文字整理&#xff0c;但还是决定尽量整理一份笔…...

Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案

在大数据时代&#xff0c;海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构&#xff0c;在处理大规模数据抓取任务时展现出强大的能力。然而&#xff0c;随着业务规模的不断扩大和数据抓取需求的日益复杂&#xff0c;传统…...

【C++】纯虚函数类外可以写实现吗?

1. 答案 先说答案&#xff0c;可以。 2.代码测试 .h头文件 #include <iostream> #include <string>// 抽象基类 class AbstractBase { public:AbstractBase() default;virtual ~AbstractBase() default; // 默认析构函数public:virtual int PureVirtualFunct…...

上位机开发过程中的设计模式体会(1):工厂方法模式、单例模式和生成器模式

简介 在我的 QT/C 开发工作中&#xff0c;合理运用设计模式极大地提高了代码的可维护性和可扩展性。本文将分享我在实际项目中应用的三种创造型模式&#xff1a;工厂方法模式、单例模式和生成器模式。 1. 工厂模式 (Factory Pattern) 应用场景 在我的 QT 项目中曾经有一个需…...

基于 HTTP 的单向流式通信协议SSE详解

SSE&#xff08;Server-Sent Events&#xff09;详解 &#x1f9e0; 什么是 SSE&#xff1f; SSE&#xff08;Server-Sent Events&#xff09; 是 HTML5 标准中定义的一种通信机制&#xff0c;它允许服务器主动将事件推送给客户端&#xff08;浏览器&#xff09;。与传统的 H…...