东莞站福公司工资,wordpress前面增加new,深圳保障性住房统一轮候信息系统,有没有便宜的网站制作前言
Arthas是一个非常牛B的东西#xff0c;我非常喜欢用#xff0c;特别是在定位线上问题的时候#xff0c;牛逼大发#xff01; 非常建议所有Java玩家都去学习一下
阅读对象
了解并使用过Arthas了解并使用过trace命令
先说结论
先说结论#xff0c;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() {// 从数据库获取数据ListMyReport reportList baseMapper.list();// 数据遍历reportList.foreach(p - {// 在这里面做一系列的运算代码800行// 但是在这里面出了问题doSomething();});
}问题
按照上面这种伪代码如果你trace Demo test的话正常来说它的输出打印类似下面
---ts2023-12-26 11:17:20;thread_namehttp-nio-8300-exec-15;id52;is_daemontrue;priority5;TCCLorg.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader5b202a3a---[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》