Tomcat类加载机制和JAVA类加载机制的比较
2021-09-30 17:36:57 0 举报
AI智能生成
登录查看完整内容
类加载机制的学习
作者其他创作
大纲/内容
BootstrapClassLoader 引导类加载器
ExtClassLoader 扩展类加载器
AppClassLoader 应用类加载器
CustomerClassLoader 用户自定义类加载器
当JVM运行过程中,用户需要加载某些类时,会按照下面的步骤(父类委托机制): 1 用户自己的类加载器,把加载请求传给父加载器,父加载器再传给其父加载器,一直到加载器树的顶层。 2 最顶层的类加载器首先针对其特定的位置加载,如果加载不到就转交给子类。 3 如果一直到底层的类加载都没有加载到,那么就会抛出异常ClassNotFoundException。 因此,按照这个过程可以想到,如果同样在CLASSPATH指定的目录中和自己工作目录中存放相同的class,会优先加载CLASSPATH目录中的文件。
JVM类加载机制
jvm类加载
BootStrap 启动类加载
System 系统类加载 CATALINA_HOME/conf
Common 通用类加载 CATALINA_HOME/lib
WebappClassLoader
Webapp 应用类加载 WEB-INF/lib 和 WEB-INF/classes
加载JVM启动所需的类,以及标准扩展类(位于jre/lib/ext下)
Bootstrap 引导类加载器
加载tomcat启动的类,比如bootstrap.jar,通常在catalina.bat或者catalina.sh中指定。位于CATALINA_HOME/bin下。
System 系统类加载器
加载tomcat使用以及应用通用的一些类,位于CATALINA_HOME/lib下,比如servlet-api.jar
Common 通用类加载器
每个应用在部署后,都会创建一个唯一的类加载器。该类加载器会加载位于 WEB-INF/lib下的jar文件中的class 和 WEB-INF/classes下的class文件。
webapp 应用类加载器
当tomcat启动时,会创建几种类加载器
当应用需要到某个类时,则会按照下面的顺序进行类加载: 1 使用bootstrap引导类加载器加载 2 使用system系统类加载器加载 3 使用应用类加载器在WEB-INF/classes中加载 4 使用应用类加载器在WEB-INF/lib中加载 5 使用common类加载器在CATALINA_HOME/lib中加载
类加载顺序
Tomcat类加载机制
Tomcat类加载
Tomcat8类加载
工作流程
优点
因为加载不到类,所以会用打破双亲委派,从子类里面加载类。
缺点
双亲委派-类加载机制
自己想实现一个JavaAgent来增强字节码的时候.
什么时候需要自定义类加载器
WebappClassLoader context: auditSystem_war_exploded delegate: false----------> Parent Classloader:java.net.URLClassLoader@3c0a50da
例子
类加载器
介绍
那么这个时候有没有办法能够做到呢?
在javaagent中访问应用中的类
实现一个可用的javaagent
javaagent字节码增强
javassist.NotFoundException: testpackage.TestClass at javassist.ClassPool.get(ClassPool.java:430) at demo01.TransformUtil.getNewByteCode(TransformUtil.java:22) at demo01.Transformer.transform(Transformer.java:66) at sun.instrument.TransformerManager.transform(TransformerManager.java:188) at sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:428) at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:763) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) at org.apache.catalina.loader.WebappClassLoaderBase.findClassInternal(WebappClassLoaderBase.java:2573) at org.apache.catalina.loader.WebappClassLoaderBase.findClass(WebappClassLoaderBase.java:859) at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1308) at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1167) at com.oneheart.xp.plugin.auditSystem.remindMassage.RemindMassageListService.buildSqlPara(RemindMassageListService.java:32) at com.oneheart.xp.framework.controller.service.impl.AbsListService.buildSql(AbsListService.java:160) at com.oneheart.xp.framework.controller.service.impl.AbsListService.calcDataList(AbsListService.java:235) at com.oneheart.xp.framework.controller.service.impl.AbsListService.listDataJson(AbsListService.java:210) at com.oneheart.xp.plugin.common.controller.core.BizController$1.call(BizController.java:46) at com.oneheart.xp.plugin.common.controller.core.BizController.handleRequest(BizController.java:248) at com.oneheart.xp.plugin.common.controller.core.BizController.handleList(BizController.java:200) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:133) at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:97) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738) at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:967) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872) at javax.servlet.http.HttpServlet.service(HttpServlet.java:648) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:94) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:504) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:620) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:502) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1132) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:684) at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2527) at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2516) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:748)
TransformUtil中WebappClassLoade类加载失败
反射找不到类
把javassist.jar包放到instrumentation里面之后,可用找到jar包里面的类了,但是这个类在报错
此路不通,可能需要对javassist.jar有所了解
深入理解Java ClassLoader及在 JavaAgent 中的对应
https://www.sohu.com/a/259979540_100212268
https://www.cnblogs.com/segeon/p/10381080.html
elastic apm
https://elasticstack.blog.csdn.net/article/details/110518265
参考文章
Tomcat类加载机制和JAVA类加载机制的比较
0 条评论
回复 删除
下一页