共计 1913 个字符,预计需要花费 5 分钟才能阅读完成。
一、类加载简介
类的加载机制是指把编译后的.class 类文件的二进制数据读取到内存中,并为之创立一个 java.lang.Class 对象,用来封装类在元数据空间的数据结构。
类在 JVM 中的生命周期为:加载,连贯,初始化,应用,卸载。不过这里只重点形容加载,连贯,初始化这三个过程。
二、加载过程
基于一张图看类加载子系统的细节流程:
1、加载阶段
过程形容
加载阶段须要实现以下三个过程:
- 通过类的全限定名来获取其定义的二进制字节流;
- 将字节流所代表的动态存储构造转化为云数据空间的运行时数据结构;
- 在堆 Heap 中生成一个代表这个类的 java.lang.Class 对象,作为对元数据空间中这些数据的拜访入口;
类加载器
- 疏导类加载器
Bootstrap-ClassLoader 基于 C /C++ 实现,负责加载 Java 的外围类库 JAVA_HOMEjrelibrt.jar,该加载器不继承自 ClassLoader 抽象类,并且只加载包名为 java、javax、sun 等结尾类,一次保障对外围源码的爱护。
- 扩大类加载器
Extension-ClassLoader,基于 Java 语言,由 sun.misc.Launcher$ExtClassLoader 实现,派生于 ClassLoader 抽象类,从 java.ext.dirs 零碎变量指定的门路中的加载类库,或者 JDK 装置目录 jrelibext 目录下加载。
- 零碎类加载器
Application-ClassLoader,基于 Java 语言,由 sun.misc.Launcher$ExtClassLoader 实现,它负责加载环境变量 ClassPath 指定的类库,如果在应用程序中没有自定义类加载器,个别状况下作为程序中默认的类加载器。
2、连贯阶段
验证
目标在于确保 Class 文件的字节流中蕴含的信息合乎以后虚拟机的要求,保障加载类的正确性,不会危害虚拟机本身的平安,次要包含四种测验动作:
- 文件格式验证:验证字节流是否合乎 Class 文件格式的标准;
- 元数据验证:确保其形容的信息合乎 Java 语言标准的要求;
- 字节码验证:确定程序语义是合乎逻辑的;
- 符号援用验证:确保解析动作能正确执行。
筹备
为类的动态变量分配内存,并初始化为默认值,这时候进行内存调配的仅包含类变量(static)润饰,不包含 (final-static) 润饰的,这里也不会为实例变量调配初始化,实例变量会随着对象一块调配到 Java 堆中。
解析
将常量池中的符号援用转换为间接援用的过程,间接援用就是间接指向指标的指针、绝对偏移量或一个间接定位到指标的句柄。解析次要针对类或接口、字段、类办法、接口办法、办法类型等,解析的动作理论是会随着 JVM 在执行完初始化之后再执行的。
3、初始化阶段
执行类结构器 clinit()办法的过程,该办法不须要自定义,是 javac 编译器主动收集类中的所有类变量的赋值动作和动态代码块中的语句合并而来,Jvm 要保障 clinit()办法在多线程拜访下的安全性。
三、机制策略
1、双亲委派模式
类加载器收到了类加载的申请时,不会本人先去尝试加载这个类,而是把申请委托给父加载器去执行;
如果父加载器还存在父类加载器,则顺次向上委托,因而类加载申请最终都应该被传递到顶层的启动类加载器中;
如果父类加载器能够实现类加载申请,就间接胜利返回,只有当父加载器在无奈实现该加载,子加载器才会尝试本人去加载该类;
2、沙箱平安机制
假如自定义一个类名为 String 且所在包为 java.lang,在应用疏导类加载器加载时会先加载 JDK 中的 String 类,因为这个类原本是属于 jdk 的,前面再次出现 String 类就会报错,以此保障源代码不被歹意篡改,这就是沙箱平安机制。
四、源代码地址
GitHub·地址
https://github.com/cicadasmile/java-base-parent
GitEE·地址
https://gitee.com/cicadasmile/java-base-parent
举荐浏览:编程体系整顿
项目名称 |
---|
【Java 形容设计模式, 算法, 数据结构】GitHub==GitEE |
【Java 根底、并发、面向对象、Web 开发】GitHub==GitEE |
【SpringCloud 微服务根底组件案例详解】GitHub==GitEE |
【SpringCloud 微服务架构实战综合案例】GitHub==GitEE |
【SpringBoot 框架根底利用入门到进阶】GitHub==GitEE |
【SpringBoot 框架整合开发罕用中间件】GitHub==GitEE |
【数据管理、分布式、架构设计根底案例】GitHub==GitEE |
【大数据系列、存储、组件、计算等框架】GitHub==GitEE |