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

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. 用Ajax实现自动刷新news功能

    这是Ajax应用的一个小实例:在页面中自动刷新功能,比如整个新闻页面中某一个小版块的内容,无需刷新整个页面就可以自动更新: 1.首先创建简单的页面元素: <body> <input ...

  2. 【2017-02-26】String类、Math类、DateTime类

    一.String类 黑色小扳手 - 属性     后面不带括号紫色立方体 - 方法     后面带括号 字符串.Length  -  字符串长度,返回int类型 字符串.TrimStart() - 去 ...

  3. error LNK2001: unresolved external symbol __beginthreadex

    解决方法: project->settings->C++>category->code generation->Use runtime library选Debug Mul ...

  4. (@WhiteTaken)UGUI中遇到的一些细碎的知识点

    最近接触Unity中UGUI的知识比较多,遇到的东西,就慢慢积累下来吧.用到就不用去网上找了. 1.Unity加载Sprite图片资源.在Unity中,我们可能会遇到,一张图片中,有多个UI,这时候导 ...

  5. nginx配置之深入理解

    继上一篇<debian+nginx配置初探--php环境.反向代理和负载均衡>成功之后,有点小兴奋,终于不用整lvs那么复杂来搞定负载,但还是有很多概念没弄清楚. 什么是CGI.FastC ...

  6. UI状态控制

    if(BillBaseStatusEnum.ADD==this.editData.getBaseStatus()){ this.btnSave.setEnabled(true); this.btnSu ...

  7. 获取手机 IP

    /** *  获取用户ip * *  @return 获取用户ip */ + (NSString *)getIPAddress { NSString *address = @"an erro ...

  8. Druid连接池配置(java无框架)

    连接池是一个对数据库连接进行管理的东西,当一个线程需要用 JDBC 对 数据库操作时,它从池中请求一个连接.当这个线程使用完了这个连接,将它返回到连接池中,这样这就可以被其它想使用它的线程使用,而不是 ...

  9. matplotlib根据Y轴数量伸缩画图的py脚本

    #coding:utf-8import numpy as npimport matplotlib.pyplot as plt #X,Y轴数据y = [20,59,11,12,16,20,15,12,1 ...

  10. 一个小时学会jQuery

    前一段时间录了一套关于jQuery的视频分享给大家,可以在下载区下载到,本来想配合文字一起的,后面发现视频+帮助文档也是非常好的学习方法. 一.jQuery简介与第一个jQuery程序 1.1.jQu ...