原文转自:
http://yueyemaitian.iteye.com/blog/1185339
一、ClassLoader
负责装载class文件;这个文件来源可能是压缩包、网络、运行时编译出的或者自动生成的class文件,jvm spec没有规定必须从什么地方加载。
jvm中默认提供了三种系统类加载器:
1)、启动类加载器Bootstrap ClassLoader,负责加载%JAVA_HOME%\jre\lib目录下的包,
2)、扩展类加载器Ext ClassLoader,负责加载%JAVA_HOME%\jre\lib\ext目录下的包,或者在java.ext.dirs系统变量锁指定的路径中的所有类库
3)、应用程序类加载器App ClassLoader,负责加载用户classpath中的包
用户也可以自定义自己的classloader,来根据自己的需求装载类文件
ClassLoader是双亲委派模型,除了Bootstrap ClassLoader外每个classloader都有自己的父加载器,每个加载器在加载某个类之前,先委托父加载器在其相关的目录加载,如果加载不到,则自己加载。
二、ClassLoader扩展的实例
1、Tomcat的类加载体系结构:
为了解决部署的web app与tomcat自身共享一份运行时代码实例、各个web app共享一份运行时代码实例、tomcat自身和各个web app私有的一份运行时代码实例,自定义了几个classloader,用来解决运行时类库的共享和隔离问题
其中Common CL是用来加载tomcat和web app共用的类库的;Catalina CL是加载Tomcat专用的类库的;Shared ClassLoader是加载web app共用的;WebApp CL用来加载应用专用的类库的web app下WEB-INF\lib下的包的;Jasper CL用来加载jsp页面,一个页面一个classloader,用来实现热替换的。
在Tomcat v5.5的时候,%CATALINA_HOME%下的common、server、shared分别由Common CL、Catalina CL、Shared CL分别加载;在Tomcat v6,则通过%CATALINA_HOME%/conf/catalina.properties下的common.loader、 server.loader、shared.loader分别设置需要相关classloader加载的jar包
2、OSGi的类加载体系结构
OSGi的 Bundle之间相互引用,需要Export、Import的,一个Bundle Export出去的类才能被外部的Bundle Import到,外部的包对Import的类的加载也需要Export出该类的Bundle的ClassLoader来完成。每个Bundle一个 ClassLoader。
3、如果做一个大型CS系统,jar包太多,比如说大于1G甚至更多;然后eclipse里把这些包作为project的library,但是启动client的时候,发现出错了
- Exception occurred executing command line.
- Cannot run program "D:\Program Files\Java\jdk1.6.0_18\bin\javaw.exe" (in directory "E:\workspace\myproject" ): CreateProcess error= 87 , ²ÎÊý²»
搜索发现是因为classpath太长了导致的,启动不了jvm,当然也可以通过虚拟盘 , 缩短classpath的方式解决该问题,而且是一种不错的办法,但是有没有其他的办法呢?classloader,对,既然classloader把一 部分装载类的权利给了我们,我们就要充分利用,我们在启动的时候加上我们自己的classloader,设置上我们自己的classpath,这个 path只填写目录名,我们在classloader中扫描目录名,然后把jar文件一个个的放入到classpath中就解决问题了
此处,设置cloassloader的命令行是哪个?设置classpath的命令行是哪个?
4、系统里边很多 jar包,当系统需要加载某个类的时候,需要扫描所有的jar包,找到这个class在不在这个jar文件里头。如果系统里jar包很多,比如说有1g甚 至更多,此时这样扫描效率就很低。如果有一种方式知道我某个类就在那个某个包里,一步就定位到了那个包,然后加载,效率岂不是很高?就此问题,我们可以先 在应用部署的时候,或者服务器启动的时候,扫描一下所有的jar包,然后在一个文件里写入package路径对应哪个jar文件,比如 com.xyz.sis.app = abc.jar。然后自定义一个ClassLoader,classloader在加载的时候缓存上边这个映射结果,直接根据要加载的类的全限定名来定位 到相应的jar包,然后加载相关的类,速度不是很快?
jvm的app classloader有没有在扫描完一次所有的jar后,缓存下哪个package对应到那个包,或者是哪个类对应到哪个包?缓存的成本。
相关推荐
3. Application ClassLoader:也称为系统类加载器,负责加载用户类路径`-cp`或`-classpath`指定的所有类。 当一个类被加载时,如果它的父类加载器无法加载该类,那么会将任务委派给子类加载器。这就是著名的"委托...
在 JVM 运行过程中,类加载器会形成一个层次结构,包括引导类加载器(Bootstrap ClassLoader)、扩展类加载器(Extension ClassLoader)和系统类加载器(System ClassLoader)。 引导类加载器(Bootstrap ...
双亲委派模型使得系统类(如java.*开头的类)由Bootstrap ClassLoader加载,而用户自定义类由应用程序类加载器(AppClassLoader)加载。这避免了类的冲突,保持了系统类库的稳定性。但有时我们可能需要打破这种模型...
### Java ClassLoader (类加载器)详解 #### 一、教程提示 如果你正在查看这份文档,在线版中你可以点击下面的任何主题直接跳转到相应的部分。 1. **教程提示** 2. **介绍** 3. **类加载器结构** 4. **编译类加载...
类加载器是 Java 语言的一个创新,也是 Java 语言流行的重要原因之一。它使得 Java 类可以被动态加载到 Java 虚拟机中并执行。类加载器从 JDK 1.0 就出现了,最初是为了满足 Java Applet 的需要而开发出来的。Java ...
扩展类加载器是一个Java类,它在运行时被Bootstrap ClassLoader加载,并且它同样会加载扩展API中的类。 3. Application ClassLoader(应用程序类加载器):也被称为System ClassLoader(系统类加载器),它负责加载...
【图解版】深入分析ClassLoader类加载工作机制,从原理到JVM的装载过程,详情分析了ClassLoader加载类以及自定义类加载器的过程,不可用于商业用途,如有版权问题,请联系删除!
在Java编程语言中,类加载器(ClassLoader)是运行时环境的核心组成部分,它负责将类的字节码从各种来源(如JAR文件、网络、内存等)加载到Java虚拟机(JVM)中,使得程序能够运行。本文将深入探讨“使用classloader...
1. **引导类加载器(Bootstrap ClassLoader)**:这是最基础的类加载器,由JVM本身实现,主要负责加载JDK核心库,如rt.jar中的类,这些类通常位于JRE的lib目录下。 2. **扩展类加载器(Extension ClassLoader)**:由...
**类加载器(ClassLoader)**是Java虚拟机(JVM)中的一个重要组成部分,它负责将编译好的`.class`文件加载到JVM中,使得这些类可以在Java环境中运行。类加载器不仅能够加载类,还能够根据不同的需求定制加载方式,如从...
在这个过程中,类加载器(ClassLoader)扮演了核心角色。本文将详细讲解类加载的流程、类加载器的层次结构以及双亲委派模型。 1. **类加载的生命周期** 类的生命周期包括7个阶段:加载、验证、准备、解析、初始化...
System.out.println("JDK提供的Object类由哪个类加载器加载--> " + classLoader); } ``` 从上述代码中可以看出,系统的类加载器是`AppClassLoader`,它的父加载器是`ExtClassLoader`,而`ExtClassLoader`的父加载...
Java类加载器分为三种主要类型:引导类加载器(Bootstrap ClassLoader)、扩展类加载器(Extension ClassLoader)和应用程序类加载器(Application ClassLoader,也称为系统类加载器)。它们共同工作,确保了Java...
在Java中,类加载器主要分为三个层次:Bootstrap ClassLoader、Extension ClassLoader和AppClassLoader。Bootstrap ClassLoader负责加载JDK的核心库,如rt.jar;Extension ClassLoader则加载JRE扩展目录下的jar文件...
- Java中的类加载器采用双亲委派模型,即一个类首先由启动类加载器Bootstrap ClassLoader尝试加载,如果找不到则交给扩展类加载器Extension ClassLoader,再找不到则交由应用程序类加载器AppClassLoader,最后如果...
类加载器遵循双亲委派模型,这意味着当一个类加载器尝试加载类时,它首先会将请求委托给其父类加载器,直到到达顶层的Bootstrap ClassLoader,如果父类加载器无法找到该类,子类加载器才会尝试自己加载。 在Tomcat...
- 应用类加载器(Application ClassLoader):加载用户类路径(classpath)上的类。 - 自定义类加载器:开发者可以根据需求创建自己的类加载器。 3. 双亲委派模型: 这是一种防止类被重复加载的机制。当一个类...
ClassLoader类的loadClass方法是实现双亲委派模型的核心方法,该方法的主要逻辑是:首先检查类是否已被加载,如果没有就判断是否已被父加载器加载,如果还没有再调用自己的findClass方法尝试加载。 知识点三:...
在Java中,类加载器主要有三层:Bootstrap ClassLoader(引导类加载器)、Extension ClassLoader(扩展类加载器)和App ClassLoader(系统类加载器)。Bootstrap ClassLoader负责加载JDK的核心库,Extension ...
在Java编程语言中,类加载器(ClassLoader)是运行时环境的一个重要组成部分,它负责将类的字节码从各种来源加载到Java虚拟机(JVM)中,从而使得程序可以执行。自定义类加载器允许开发人员根据特定需求定制加载类的...