在开发apm链路追踪项目的时候遇到一些坑,比如采集http应用性能时找不到目标类httpservlet,使用fastjson输出出现类加载器的问题。
在Tomcat类加载模型中,AppClassLoader下还有commonclassloader,它下面又有webclassloader,子类加载器可以访问父类,而父类是不能访问子类的,所以当出现父类加载器加载的类去访问子类加载器加载的类的时候就会报错
出现这种问题的解决办法之一就是将子类加载器中的类打包到父类加载器模块中,比如父类加载器中加载的类访问不到json类,就可以将json打包到父类。
还有个坑是json会使用当前线程的类加载器来加载要使用的类,如果要使用的类不在当前线程的类加载器下,也会报错
当前线程的类加载器:
也就是说当前的类加载webappclassloader下没有ServiceStatistis类,所以会报错。
可以查看ASMClassloader类的源码,其中会判断类加载器是否和当前线程的类加载器一致,不一致就会使用asm加载器
apm中关于类加载器(Tomcat和json)的坑
最新推荐文章于 2023-02-21 17:48:30 发布