lambda表达式导致arthas无法redefine的问题

lambda表达式导致arthas无法redefine的问题

💡 原文中文,约3000字,阅读约需7分钟。
📝

内容提要

文章讨论了使用阿里巴巴的Arthas工具时,由于Java lambda表达式导致无法重新定义类的问题。通过对比不同JDK版本,发现旧版本的lambda方法名是全局递增的,而新版本则是每个类单独编号。解决方案是升级JDK版本,以避免此问题。

🎯

关键要点

  • 使用阿里巴巴的Arthas工具时,Java lambda表达式导致无法重新定义类的问题。
  • 旧版本的JDK中,lambda方法名是全局递增的,而新版本中每个类的lambda方法名是单独编号的。
  • 通过对比不同JDK版本,发现线上编译的JDK版本是1.8.0_66-b17,而本地是1.8.0_222-b10。
  • 确认问题后,发现不同版本的javac逻辑不同,旧版本使用全局递增计数器,而新版本则是每个类重新计数。
  • 解决方案是升级JDK版本,以避免此问题,建议切换到1.8.0_231-b11版本。

延伸问答

为什么使用Arthas时会出现无法重新定义类的问题?

因为Java的lambda表达式在不同JDK版本中处理方式不同,导致方法名不一致,从而无法重新定义类。

旧版本和新版本JDK在处理lambda表达式时有什么区别?

旧版本的lambda方法名是全局递增的,而新版本则是每个类单独编号。

如何解决Arthas无法重新定义类的问题?

解决方案是升级JDK版本,建议切换到1.8.0_231-b11版本。

线上和本地JDK版本的差异是什么?

线上编译的JDK版本是1.8.0_66-b17,而本地是1.8.0_222-b10。

lambda表达式的方法名是如何生成的?

lambda的方法名格式为lambda$<methodname>$<lambdaCount>,新版本的javac会为每个类重新计数。

JDK版本变更是从哪个版本开始的?

这个变更是从jdk8u74-b02版本引入的。

➡️

继续阅读