在类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类。实现这个动作的代码模块被称为“类加载器”。任意一个类都需要加载它的类加载器和这个类本身一同确立其在java虚拟机中的唯一性。两个类的加载他们的类加载器不同,那这两个类就必定不相等。这里所指的相等,包括代表类的Class对象的equals方法、isAssignableFrom()方法、isInstance()方法的返回结果,,也包括了使用instanceof()关键字做对象所属关系判定等情况。

 

从虚拟机角度讲只存在两种不同的类加载器:

启动类加载器(Bootstrap ClassLoader):C++语言实现,是虚拟机自身的一部分。负责将JAVA_HOME\lib目录中的,或者被-Xbootclasspath参数所指定的路径中,并且是虚拟机只按照文件名识别的类库加载到虚拟机中,不符合的不会加载。此加载器无法被java程序直接引用。

所有其他的类加载器:java语言实现,独立于虚拟机外部,都继承自抽象类java.lang.ClassLoader。

       扩展类加载器(Extention ClassLoader),负责加载<JAVA_HOME>\lib\ext目录中的,或者被java.ext.dirs系统变量所指定的路径中的所有类库。

       应用程序类加载(Application ClassLoader),是ClassLoader中的getSystemCLassLoader()方法的返回值,称为系统类加载器,负责嘉爱用户类路径(ClassPath)上所指定的类库,是一般程序中默认的类加载器。

 

双亲委派模型

双亲委派模型的工作流程是:如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把请求委托给父加载器去完成,依次向上,因此,所有的类加载请求最终都应该被传递到顶层的启动类加载器中,只有当父加载器在它的搜索范围中没有找到所需的类时,即无法完成该加载,子加载器才会尝试自己去加载该类。

双亲委派机制:

1、当 AppClassLoader加载一个class时,它首先不会自己去尝试加载这个类,而是把类加载请求委派给父类加载器ExtClassLoader去完成。

2、当 ExtClassLoader加载一个class时,它首先也不会自己去尝试加载这个类,而是把类加载请求委派给BootStrapClassLoader```去完成。

3、如果 BootStrapClassLoader加载失败(例如在 $JAVA_HOME/jre/lib里未查找到该class),会使用 ExtClassLoader来尝试加载;

4、若ExtClassLoader也加载失败,则会使用 AppClassLoader来加载,如果 AppClassLoader也加载失败,则会报出异常 ClassNotFoundException。

java.lang.ClassLoader.loadClass源码:

 

protected Class<?> loadClass(String name, boolean resolve)

throws ClassNotFoundException

{

synchronized (getClassLoadingLock(name)) {

// First, check if the class has already been loaded

Class<?> c = findLoadedClass(name);

if (c == null) {

long t0 = System.nanoTime();

try {

if (parent != null) {

c = parent.loadClass(name, false);

} else {

c = findBootstrapClassOrNull(name);

}

} catch (ClassNotFoundException e) {

// ClassNotFoundException thrown if class not found

// from the non-null parent class loader

}

if (c == null) {

// If still not found, then invoke findClass in order

// to find the class.

long t1 = System.nanoTime();

c = findClass(name);

// this is the defining class loader; record the stats

sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);

sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);

sun.misc.PerfCounter.getFindClasses().increment();

}

}

if (resolve) {

resolveClass(c);

}

return c;

}

}

参考资料:《深入理解java虚拟机》--周志明

转载于:https://www.cnblogs.com/huster-huwentao/p/9340078.html

JAVA虚拟机类加载机制之类加载的时机双亲委派模型相关推荐

  1. Java虚拟机:对象创建过程与类加载机制、双亲委派模型

    一.对象的创建过程: 1.对象的创建过程: 对象的创建过程一般是从 new 指令(JVM层面)开始的,整个创建过程如下: (1)首先检查 new 指令的参数是否能在常量池中定位到一个类的符号引用: ( ...

  2. 类加载过程以及类加载的机制(双亲委派模型)

    文章目录 一.类加载的时机 二.类加载过程 三.类加载的机制:双亲委派模型 1.双亲委派模型是什么 2.ClassNotFoundException 和 NoClassDefFoundError 3. ...

  3. java类加载和双亲委派模型浅说

    本文目录 前言 一.类加载器 1.1 类加载机制的基本特征 1.2 类加载的分类 1.3 类加载器 A.启动类加载器(引导类加载器,Bootstrap ClassLoader) B.扩展类加载器(Ex ...

  4. 双亲委托类加载机制_图解JVM类加载机制和双亲委派模型

    我们都知道以 .java 结尾的 Java 源文件,经过编译之后会变成 .class 结尾的字节码文件.JVM 通过类加载器来加载字节码文件,然后再执行程序. 什么时候加载一个类 那么,什么时候类加载 ...

  5. JVM初学之类java的类加载器和双亲委派模型

    类加载器: 定义:java类加载器用于对java类的加载,java有自带的类加载器,也可以自定义类加载器实现定制化,类似于tomcat. java自带了三个系统的类加载器:如下图: 双亲委派模型: 背 ...

  6. 深入理解 Tomcat(四)Tomcat 类加载器之为何违背双亲委派模型

    这是我们研究Tomcat的第四篇文章,前三篇文章我们搭建了源码框架,了解了tomcat的大致的设计架构, 还写了一个简单的服务器.按照我们最初订的计划,今天,我们要开始研究tomcat的几个主要组件( ...

  7. Java 双亲委派模型机制

    前言 Java是运行在Java的虚拟机(JVM)中的,在初步学习Java时,我们都知道,编写的Java源代码会被编译器编译成.class的字节码文件.然后ClassLoader负责将这些class文件 ...

  8. java的双亲委派模型-附源码分析

    1.类加载器 1.1 类加载的概念   要了解双亲委派模型,首先我们需要知道java的类加载器.所谓类加载器就是通过一个类的全限定名来获取描述此类的二进制字节流,然后把这个字节流加载到虚拟机中,获取响 ...

  9. java破坏双亲委派_破坏双亲委派模型

    上次说了类加载器以及它的双亲委派模型,同样提到了双亲委派模型并不是一种强制的约束,而是推荐给开发者的类加载器的实现方式,在java中,大部分类加载器都会遵循这个模型,但是也有例外,到目前为止,双亲委派 ...

最新文章

  1. 【Sql Server】DateBase-SQL调整
  2. Java -jar启动服务与Tomcat服务器上部署JAR之间的区别
  3. linux 的压缩文件格式,linux 文件格式压缩
  4. 【内核模块auth_rpcgss】netns引用计数泄露导致容器弹性网卡残留
  5. hive - 解析 json
  6. Linux中变量 #, @, 0, 1, 2, *,$$,$?的含义
  7. bat ping 返回值_清清楚楚玩游戏!10.10版本,赛娜被动层数可以ping给队友看了
  8. 英语总结系列(五):英语无处不在
  9. git报错:ssh variant 'simple' does not support setting port解决
  10. 人员基础信息一体化采集系统平台
  11. 数据结构算法之关键路径
  12. LeetCode 448.找到所有数组中消失的数字
  13. 中科红旗开始新一轮招聘,服务器、桌面研发工程师、测试工程师
  14. layui tree 对节点进行搜索
  15. 使用XGboost模块XGBClassifier、plot_importance来做特征重要性排序——修改f1,f2等字段
  16. 一文带你了解外贸海关数据
  17. 计算机管理系统包括啥,供应链管理系统包括哪些模块
  18. 4款口碑爆棚电脑黑科技软件,强烈建议低调使用!
  19. 自组网中继台_Mesh自组网设备-无线自组网设备-单兵自组网设备_腾远智拓
  20. 甘肃地震致一家5口遇难 遗体紧紧相拥无法分开

热门文章

  1. eclipse package包 java类 有问号 无法读取的问题解决
  2. SELinux系列(九)——SELinux auditd日志系统的安装与启动
  3. 低代码工具让人人都是程序员?别再吐槽了,它能做这些事
  4. 报表人的福音!25个实用报表模板合集,适用多个业务场景
  5. AS3.0常用第三方类库:TweenMax
  6. 语言用符号打印出落叶的图案_世界上最好玩的6种表情符号编程语言
  7. linux tensorflow demo_独家 | 在浏览器中使用TensorFlow.js和Python构建机器学习模型(附代码)...
  8. python图片保存需要在图片展示后_用python处理图片之打开\显示\保存图像的方法...
  9. Request库入门
  10. 人脸关键点:TCDCN-Facial Landmark Detection by Deep Multi-task Learning