美文网首页
找到lambda对应的java源码位置

找到lambda对应的java源码位置

作者: 黄云斌huangyunbin | 来源:发表于2018-11-27 17:37 被阅读0次
排查问题的时候我们经常用到jstack来看方法的调用栈,但是对于lambda我们是看不到代码行数的
image.png

看到

    at io.atomix.copycat.client.util.ClientConnection$$Lambda$425/473597305.apply(Unknown Source)

估计都是非常懵逼的。一个类里面有很多的lambda啊
当然有人说我根据调用栈的前后关系大概就能猜出是哪个lambda。
确实是这样的,不过是要是稍微花点时间了。

对于mat中看内存的情况呢?
image.png

在没有明显的上下文的时候,猜基本是大海捞针了。

折腾了不少时间,终于找到了办法

步骤一
-Djdk.internal.lambda.dumpProxyClasses=/home/alex.ma/yunbin

通过这个参数指定lambda的导出目录,程序运行后就会在对应目录找到这个lambda


image.png

执行命令

javap -p -v ClientSessionSubmitter\$\$Lambda\$452

得到一堆的结果,前面的都不用看,直接看最后

image.png

可以看到其实是指向

io/atomix/copycat/client/session/ClientSessionSubmitter.lambda$submit$3

一脸懵逼啊,原来这里只是个映射啊,不过这里已经看到了希望了。

步骤二,javap 对应类的类,得到详细信息
javap -p -v ClientSessionSubmitter 

这里得到的结果就更多了,我们搜索lambdasubmit3,会看到方法的定义,

image.png
这里我们可以看到说是的149行,这样我们就找到了lambda的真身了。
image.png
lambda 真的是对于调试找问题很不友好啊,折腾了半天才定位到源码。

相关文章

网友评论

      本文标题:找到lambda对应的java源码位置

      本文链接:https://www.haomeiwen.com/subject/nzzgqqtx.html