类加载的过程以及双亲委派模型

类的生命周期 

加载-->验证-->准备-->解析-->初始化-->使用-->卸载

1)加载

在加载Loading阶段,Java虚拟机需要完成以下三件事情:
1)通过⼀个类的全限定名来获取定义此类的⼆进制字节流。
2)将这个字节流所代表的静态存储结构转化为⽅法区的运⾏时数据结构。
3)在内存中⽣成⼀个代表这个类的java.lang.Class对象,作为⽅法区这个类的各种数据的访问⼊。

2)验证

验证是连接阶段的第⼀步,这⼀阶段的⽬的是确保Class⽂件的字节流中包含的信息符合《Java虚拟机规范》的全部约束要求,保证这些信息被当作代码运⾏后不会危害虚拟机⾃⾝的安全。
验证选项:
• ⽂件格式验证
• 字节码验证
• 符号引⽤验证...

3)准备

准备阶段是正式为类中定义的变量(即静态变量,被static修饰的变量)分配内存并设置类变量初始值的阶段

4)解析

解析阶段是Java虚拟机将常量池内的符号引⽤替换为直接引⽤的过程,也就是初始化常量的过程。

 5)初始化

初始化阶段,Java虚拟机真正开始执⾏类中编写的Java程序代码,将主导权移交给应⽤程序。初始化阶段就是执⾏类构造器⽅法的过程

简单总结一下类加载

a) 加载:找到.class文件,并解读文件内容

b) 验证:校验.class文件格式是否符合JVM规范要求

c) 准备:给类分配内存(此时内存空间是全0的=> 类的静态成员变量也就是全0的值)

d) 解析:针对类中字符串常量进行处理

e) 初始化:把类对象的各个部分的属性进行赋值填充 => 触发对父类加载 初始化静态成员,执行静态代码块

什么是双亲委派模型

如果一个类加载器收到了类加载的请求,他首先不会自己加载这个类,而是把这个请求委派给父类加载器去完成,每个层次的类加载器都是如此 ,因此所有的加载请求最终都应该传送到最顶层的启动类加载器中,只有当父类加载器反馈自己无法完成这个加载请求,子加载器才会尝试自己去完成加载

双亲委派模型(加载环节)

描述如何查找.class文件的策略

JVM中进行类加载的操作,是有一个专门的模块.称为"类加载器"

JVM中的类加载器默认是有三个(可以自定义)

BootstrapClassLoader   负责查找标准库的目录

ExtensionClassLoader   负责查找扩展库的目录

ApplicationClassLoader  负责查找当前项目的代码目录以及第三方库的目录

双亲委派模型的优点 

1. 避免重复加载类:⽐如A类和B类都有⼀个⽗类C类,那么当A启动时就会将C类加载起来,那么在B类进⾏加载时就不需要在重复加载C类了。
2. 安全性:使⽤双亲委派模型也可以保证了Java的核⼼API不被篡改,如果没有使⽤双亲委派模型,⽽是每个类加载器加载⾃⼰的话就会出现⼀些问题,⽐如我们编写⼀个称为java.lang.Object类的话,那么程序运⾏的时候,系统就会出现多个不同的Object类,⽽有些Object类⼜是⽤⼾⾃⼰提供的因此安全性就不能得到保证了

3.打破双亲委派模型:
打破双亲委派机制则不仅要继承ClassLoader类,还要重写loadClass和findClass方法。

相关推荐

  1. 器与双亲委派模型

    2024-04-06 17:54:03       35 阅读
  2. 简单聊聊双亲委派模型

    2024-04-06 17:54:03       17 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-06 17:54:03       19 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-06 17:54:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-06 17:54:03       20 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-06 17:54:03       20 阅读

热门阅读

  1. 零日攻击测试

    2024-04-06 17:54:03       25 阅读
  2. 如何解决Docker镜像仓库认证失败的问题?

    2024-04-06 17:54:03       12 阅读
  3. NumPy 数组对象

    2024-04-06 17:54:03       18 阅读
  4. 星弟专享面试题汇总(星弟亲自总结)

    2024-04-06 17:54:03       19 阅读
  5. xss介绍及作用

    2024-04-06 17:54:03       18 阅读