一.体系结构(自上向下)

1.Bootstrap ClassLoader(BootStrapClassLoader) --- 启动类加载器或者叫引导类加载器,加载jdk核心的APIs,这些APIs一般位于jdk_home/lib下;它是一个本地接口,所以不能从java代码中得到它的信息。例如, log(java.lang.String.class.getClassLoader())得到的是null。

2.Extension ClassLoader(Launcher$ExtClassLoader) --- 扩展类加载器, 负责加载jdk_home/lib/ext目录下的API;

3.System ClassLoader(Launcher$AppClassLoader) --- 系统类加载器  主要负责java -classpath所指的目录下的APIs。

4.Custom ClassLoader --- 用户自定义类加载器,是java.lang.ClassLoader的子类),负责在程序运行期间, 通过java.lang.ClassLoader的子类动态加载class文件。

二.加载机制

Java的ClassLoader是以父子结构展现的。当有请求向加载器请求类时,首先自底向上去寻找是否已经加载了所需的类,如果存在就返回这个类;如果不存在,就委托当前加载器的父加载器去完成加载类的请求,如果父加载器还有上一级,就向上一级的记载器请求去加载所需类,直到顶层,若顶层加载器(BootStrapClassLoader)无法加载类,就回到下一级,如果下一级仍无法加载,再下一级,直到当前的类加载器,如果仍加载不到,就会抛出ClassNotFoundExceptio。 注意:这里的父子关系不是java中的继承关系,可以理解为一种委托关系。

三.类的唯一标识

JVM中,类的唯一标识是(类名,包名,加载器),由不同加载器加载的类,即使具有相同的类名和包名,也不会被认为是同一个实例,不是类型可比型的。例如:ClassLoader A 有两个子加载器ClassLoader B 和 ClassLoader C,类Foo对ClassLoaderB和ClassLoaderC是可见的,对ClassLoaderA是不可见的,当有请求向ClassLoaderB和ClassLoaderC请求Foo的实例时,由于两个加载器会分别加载Foo,这样JVM会产生两个Foo的实例(foo1,foo2),而且它们是不可比的, 语句foo1=(Foo)foo2会抛出ClassCastException;当然,如果Foo对ClassLoaderA是可见的,Foo就会由ClassLoaderA加载,就不会产生ClassCastException了。

四.Servelet容器中类加载器

在Tomat5中简单做了个测试,发现Thread.currentThread().getContextClassLoader()得到的是如下的结果:

webapp classloader:WebappClassLoader
  delegate: false
  repositories:
    /WEB-INF/classes/
----------> Parent Classloader:
org.apache.catalina.loader.StandardClassLoader@1f26605

按照“Servlet Specification, version 2.3, section 9.7.2 Web Application Classloader”说法,通过WebappClassLoader应该能够加载任何库文件中的资源,但是不能覆盖J2SE和servlet APIs;将来值得推荐的做法servlet的加载器不允许servlet去访问web容器的实现类。

这里,摘录了官网上的Tomcat5和Tomcat6类加载的顺序:

Tomcat 5:

 Bootstrap classes of your JVM
 System class loader classes
 /WEB-INF/classes of your web application
 /WEB-INF/lib/*.jar of your web application
 $CATALINA_HOME/common/classes
 $CATALINA_HOME/common/endorsed/*.jar
 $CATALINA_HOME/common/i18n/*.jar
 $CATALINA_HOME/common/lib/*.jar
 $CATALINA_BASE/shared/classes
 $CATALINA_BASE/shared/lib/*.jar

Tomcat 6:

 Bootstrap classes of your JVM
 System class loader classes
 /WEB-INF/classes of your web application
 /WEB-INF/lib/*.jar of your web application
 $CATALINA_HOME/lib
 $CATALINA_HOME/lib/*.jar

Java ClassLoader加载机制的更多相关文章

  1. Java ClassLoader加载机制理解 实际例子

    针对 Java ClassLoader加载机制理解, 做了个如何自定制简单的ClassLoader,并成功加载指定的类. 不废话,直接上代码. package com.chq.study.cl; im ...

  2. Java ClassLoader加载机制理解

    今天看到了一篇介绍Java ClassLoader加载机器的文章, 才发觉一直来自己的肤浅, 好好地给补了一课, 不得不存档! 原文地址: http://www.blogjava.net/lhulcn ...

  3. java class加载机制及对象生成机制

    java class加载机制及对象生成机制 当使用到某个类,但该类还未初始化,未加载到内存中时会经历类加载.链接.初始化三个步骤完成类的初始化.需要注意的是类的初始化和链接的顺序有可能是互换的. Cl ...

  4. java动态加载机制

    假设有一个class,ClassLoader首先把它load到内存里的code segment(内存里存放代码段的),站在ClassLoader的角度,内存里的一个一个的class就是一个一个的对象, ...

  5. java内存加载机制

    什么是java类加载? 类加载是指将.class类中的二进制数据存放到内存中,会在内存中的推中建立一个java.lang.String的引用对象来存放方法区的数据结构,而类中的数据会放到方法区中 类加 ...

  6. jvm系列(一):java类的加载机制

    java类的加载机制 1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装 ...

  7. Java高级之虚拟机加载机制

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 1.0版本:2016-05-21 SubClass!! 执行结果说明一个问题:子类调用父类变量的时候 ...

  8. java加载机制整理

    本文是根据李刚的<疯狂讲义>作的笔记,程序有的地方做了修改,特别是路径,一直在混淆,浪费了好多时间!!希望懂的同学能够指导本人,感激尽............ 1.jvm 和 类的关系 当 ...

  9. 深入理解ClassLoader(四)—类的父委托加载机制

    上几次我们介绍到了JVM内部的几个类加载器,我们来重新画一下这个图,再来看一下他们之间的关系.

随机推荐

  1. Asp.net mvc 知多少(十)

    本系列主要翻译自<ASP.NET MVC Interview Questions and Answers >- By Shailendra Chauhan,想看英文原版的可访问http:/ ...

  2. 关于pthread_create未定义的引用的奇葩解决

    1本来在代码里包含了pthread.h  第一次编译:gcc -o create create.c  提示错误 未定义的引用 2后来知道linux标准库没有pthread.h 要链接之-lpthrea ...

  3. Python全栈开发——Linux命令学习

    Linux -- 一切皆文件 pwd: 查看当前所在目录 '/' :根目录 cd : 切换目录   eg.cd /    切换到根目录 ls:查看当前根目录下有几块盘.几个文件 ls -l:查看详细信 ...

  4. JVM运行和类加载过程

    JAVA的JVM的内存可分为3个区:堆(heap).栈(stack)和方法区(method) (该知识点引用 http://www.cnblogs.com/dingyingsi/p/3760730.h ...

  5. 使用IDEA的gradle整合spring+ mybatis 采用javaconfig配置

    1.新建一个工程 2.工程目录 3.添加gradle.propertes文件 activeMQVersion=5.7.0 aspectJVersion=1.7.2 commonsLangVersion ...

  6. .Net程序员学用Oracle系列(21):分组查询(GROUP BY)

    1.GROUP BY 标准分组 1.1.GROUP BY 概述 1.2.WHERE 和 HAVING 的区别? 2.GROUP BY 扩展分组 2.1.ROLLUP 分组 2.2.CUBE 分组 2. ...

  7. Ajax写分页查询(实现不刷新页面)

    获取数据库中大量的信息显示在页面上,必然要使用到分页查询: 若不使用Ajax,而是用其他的方法,肯定是要刷新页面的,用户体检很不好, 所以最好使用Ajax的方法写分页查询: 1.先来找一张数据很多的表 ...

  8. django generic view - ListView

    ListView (带分页) 1.带分页效果的基础模板 1) view from django.views.generic.list import ListView from employ.model ...

  9. 《Machine Learning》系列学习笔记之第三周

    第三周 第一部分 Classification and Representation Classification 为了尝试分类,一种方法是使用线性回归,并将大于0.5的所有预测映射为1,所有小于0. ...

  10. web注册功能实现

    开发工具:Eclipse Web前端语言:html+jsp 后端数据库:MySQL 数据库UI工具:Navicat for MySQL (根据网上各位前辈的信息,自学实现这个注册基本功能,以后要是学到 ...