以下内容出自一个同事的整理资料。
一。java类加载器机制简介
这个由Bootstrap Loader -> ExtClassLoader ->
AppClassLoader,就是java类装载器的层次体系。
Bootstrap
Loader是参考系统参数sun.boot.class.path;
ExtClassLoader是参考系统参数java.ext.dirs;
AppClassLoader
是参考从系统参数java.class.path取出的字符串。
Bootstrap
Loader搜索路径是系统参数,无法更改,他的搜索路径为jdk目录\jre\lib下的一些jar包;
ExtClassLoader的搜索路径为jdk目录\jre\lib\ext下的所有class或jar包;
AppClassLoader的搜索路径为系统的classpath。
AppClassLoader和ExtClassLoader的搜索路径可以修改,但是不能在执行时间动态更改。
java中类装载采用“代理机制”,即子装载器如果需要装载一个类文件,首先会将此任务提交给父装载器,
如果父装载器找不到此类文件,才有子装载器来装载类文件,如果子装载器也找不到,
那么就会报告ClassNotFoundException异常。
如图所示:
二.tomcat应用服务器中的类加载机制
1.BootStrap
classloader(加载JRE/lib下的rt.jar和其他重要jar文件)
2.ExtClassLoader
(加载JRE/lib/ext下的jar文件,Java扩展框架使用)
3.AppClassLoader
($CATALINA_HOME/bin/下bootstrap.jar, commons-logging
-api.jar,commons-daemon.jar,$JAVA_HOME/lib/tools.jar,jmx.jar)
4.common
(加载$CATALINA_HOME/common/,Tomcat本身和Web App共享类)
5.Catalina (加载$CATALINA_HOME
/server/,Tomcat本身使用的类)
Shared (加载$CATALINA_BASE /shared/,所有Web
App共享类)
6.WebappClassLoader (加载各个Web App的class,不同的Web App被隔离开)
注意:Tomcat完全忽略了classpath的设置,而重新设置了classpath,所以AppClassLoader
载入的类将不是class path设置的类。
三.weblogic应用服务器中的类加载机制
当部署一个应用的时候,weblogic
server会自动创建一个具有层次结构的类装载器。
在图中,
1. 系统类路径加载器负责装载应用中的所有的EJB JAR文件;
2.
应用程序加载器负责装载所有的Web application 中的WAR 文件(所有得jsp文件除外);
3. Jsp Classloader
负责装载Web application 中的所有的jsp
文件;
weblogic中默认有以下几个级别:
1.系统类路径,除了java路径和java扩展路径,这个算是级别最高的了。
2.APP-INF/lib
or APP-INF/classes,它比系统类路径的级别低了一级。
3.WEB-INF/lib or
WEB-INF/classes,这个应该是最低的级别了。
classLoader在装载类的时间会从上而下的顺序来装载类。首先装载java自身的类(安全考虑),如果没有找到要装载的类,就查找java扩展路径下的类,如果还没找到就系统类路径,在然后
APP-INF/lib or APP-INF/classes,再然后WEB-INF/lib or WEB-INF/classes。
如图所示:
分享到:
相关推荐
- **Web容器中的类隔离**:不同的Web应用部署在同一台服务器上时,每个应用都有自己的类加载器,从而实现了类的隔离。 - **热部署**:通过自定义类加载器实现代码的热更新,无需重启服务即可更新部分类的实现。 - **...
这在某些场景下非常有用,比如在J2EE服务器中,每个应用可能有自己的类加载器,确保应用间的类隔离。 创建自定义类加载器需要继承`java.lang.ClassLoader`,并重写`findClass()`方法。在该方法中,可以读取类的字节...
这为Java的模块化和隔离提供了基础,例如,在Web应用服务器中,每个Web应用都有自己的类加载器,保证了不同应用之间的类隔离。 6. **类加载器的卸载** 由于Java的垃圾收集机制不直接回收类加载器,除非整个...
类加载器的工作机制遵循“双亲委派模型”:当一个类加载器接收到加载类的请求时,它首先会委托父加载器去尝试加载,只有在父加载器无法加载的情况下,子加载器才会尝试自己去加载。这种设计可以防止类的重复加载,并...
Java 类加载机制是Java平台的核心特性之一,它负责将类的字节码加载到Java虚拟机(JVM)中并转换为运行时的类对象。理解这一机制对于优化应用程序性能和解决类相关的错误至关重要。 首先,类加载的过程分为三个主要...
双亲委派机制是 Java 中的一种类加载机制,用于解决类加载器之间的关系。其工作原理是:当一个类加载器需要加载某个类时,首先将请求委派给其父加载器,如果父加载器可以加载该类,则由父加载器加载,否则继续委派给...
【深入探讨 Java 类加载器】 Java 类加载器是Java虚拟机(JVM)的核心组成部分,它的主要任务是将Java类的字节码加载到JVM中以便执行。类加载器的概念始于JDK 1.0,最初是为了解决Java Applet在浏览器中的运行需求...
总的来说,类加载器和类加载机制是Java语言动态性的基础,了解它们的工作原理不仅有助于我们深入理解JVM的运行过程,也有助于我们开发出更加灵活和强大的Java应用程序。通过控制类的加载,我们可以实现热部署、动态...
这对于应用程序服务器和插件系统尤其有用,因为它允许组件使用自己的类加载器加载类,而不是依赖全局的类加载器。 总结起来,Java类加载机制的双亲模型保证了系统的稳定性,而自定义类加载器则提供了灵活性,允许...
线程上下文类加载器(Thread Context ClassLoader)则是在特定线程中使用的类加载器,主要用于解决一些应用服务器中类加载的复杂问题,如J2EE容器中的类加载需求。 总的来说,理解Java类加载机制对于排查类加载错误...
Java的类加载机制遵循双亲委派模型,即当一个类加载器接收到加载类的请求时,它会首先将这个任务委托给父类加载器,只有当父类加载器无法找到对应的类时,才会尝试自己去加载。这种设计有助于保持类的唯一性和避免...
在Java Web开发中,Tomcat作为最常用的Servlet容器,其类加载机制对于理解和优化应用性能至关重要。本文将深入探讨Tomcat的ClassLoader是如何工作的,以及它如何影响到我们的应用程序。 首先,理解类加载器...
总之,理解Java类加载机制对于优化Java应用性能至关重要,特别是对于Java EE环境下的大规模应用,合理配置和利用类加载器可以显著提升系统运行效率。同时,开发者应该关注Java版本的更新,充分利用新版本提供的性能...
- Java的类加载机制遵循双亲委派模型,即当一个类加载器接收到加载类的请求时,它首先会将请求委托给父类加载器。只有当父类加载器无法找到对应的类时,子类加载器才会尝试加载。这种设计有助于避免类的重复加载,...
总结来说,Tomcat类加载器对于理解和调试多应用环境下的Java应用程序至关重要,而"DevLoader"可能是一种专为开发环境优化的类加载器,提供热部署等功能。对这个主题的深入理解有助于优化开发流程,提高生产力。
深入了解 Java 类加载机制对于开发高质量的应用程序至关重要。本文详细介绍了类加载的基础概念、类加载器的类型及其工作流程,并通过实际示例展示了如何创建自定义类加载器。掌握了这些知识后,开发者可以更好地应对...
总之,Java类的加载涉及到类加载器、类路径以及Java的双亲委派模型,理解这些概念对于调试和优化Java应用的性能至关重要。在开发过程中,合理设置类路径,以及适当地利用类加载器的特性,可以帮助我们更好地管理和...
Java的类加载器分为多个层次,包括引导类加载器(Bootstrap ClassLoader)、扩展类加载器(Extension ClassLoader)和应用程序类加载器(Application ClassLoader)。 引导类加载器是JVM启动时的第一个加载器,负责...
Java类加载器的这种机制也使得Java类加载器具有很好的扩展性,比如在Web服务器和应用服务器中经常使用自定义的类加载器来实现热部署、模块化等高级功能。开发者可以实现自己的类加载器来从特定来源(比如数据库、...