LinkageError 排查过程

问题

在部署loan-lending的分支进行测试进件的时候,发现了如下的报错:
linkage-1

分析过程

  1. 看着就像是ClassLoader找不到对应的类;但是这个类就是此应用的class文件,还不是引入的二,三方包,奇怪。
  2. 在本地和k2上面都打印了对应的classLoader,看起来也都比较正常。3
  3. 在本地重启,关闭了一些干扰功能和日志(特别是consumer),好好观察了下日志,发现每次出现问题之前一定会有一次这个错误:
    linkage-2

  4. 这个问题看着就像是包冲突了,那么解决netty的包冲突,去掉所有其他的netty包,留下了一个版本,然后重启,再次测试没有问题了!!

推测

JVM在运行时加载类A的时候,如果类A的static 区域发送了LinkageError,那么这个A也会发生LinkageError。所以第一次报错是static区域中具体的LinkageError信息第二次以及以后的报错都是A相关的LinkageError;如果是在线上不断的有日志打印,还有很多其他的混淆信息,很难发现有且仅有一次的报错;(因为正常排查逻辑都会去关注报错量较大的信息)。

实验证明

  1. 自己起了项目,在HttpIo中增加如下代码:
    linkage-3

  2. testBean 嵌套 testBean2,
    linkage-4
    linkage-5

  3. 最外层的测试用例用反射调用testBean的test方法
    linkage-6
  4. 用这个模拟了真实应用中prophetclient相关的调用过程,最终调用看如下日志:
    linkage-7

    最终结论

    最终推测成立:
    >
    JVM在运行时加载类A的时候,如果类A的static 区域发送了LinkageError,那么这个A也会发生LinkageError。所以第一次报错是static区域中具体的LinkageError信息第二次以及以后的报错都是A相关的LinkageError