排查问题的时候我们经常用到jstack来看方法的调用栈,但是对于lambda我们是看不到代码行数的
看到
at io.atomix.copycat.client.util.ClientConnection$$Lambda$425/473597305.apply(Unknown Source)
估计都是非常懵逼的。一个类里面有很多的lambda啊
当然有人说我根据调用栈的前后关系大概就能猜出是哪个lambda。
确实是这样的,不过是要是稍微花点时间了。
对于mat中看内存的情况呢?
在没有明显的上下文的时候,猜基本是大海捞针了。
折腾了不少时间,终于找到了办法
步骤一
-Djdk.internal.lambda.dumpProxyClasses=/home/alex.ma/yunbin
通过这个参数指定lambda的导出目录,程序运行后就会在对应目录找到这个lambda
执行命令
javap -p -v ClientSessionSubmitter\$\$Lambda\$452
得到一堆的结果,前面的都不用看,直接看最后
可以看到其实是指向
io/atomix/copycat/client/session/ClientSessionSubmitter.lambda$submit$3
一脸懵逼啊,原来这里只是个映射啊,不过这里已经看到了希望了。
步骤二,javap 对应类的类,得到详细信息
javap -p -v ClientSessionSubmitter
这里得到的结果就更多了,我们搜索lambda3,会看到方法的定义,