深入Java虚拟机之 -- 类加载机制

深入Java虚拟机之 – 类加载机制

一、类加载机制

虚拟机把描述类的数据从Class文件 (二进制流) 加载到内存,并对数据结构进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是Java的类加载机制。如下图:
在这里插入图片描述

二、类加载的时机

类从加载到虚拟机的内存开始,到卸载出内存结束,中间会经历7个阶段,即加载、验证、准备、解析、初始化、使用和卸载;其中 验证、准备和解析也被称为连接。
在这里插入图片描述
其中,加载、验证、准备、初始化和卸载这五个顺序是固定的,而解析则不一定,因为Java是动态语言,它支持动态绑定,或在初始化后开始;现在对这些状态进行解释分析

2.1 加载

加载过程主要完成以下3件事

    1. 通过一个类的全限名来获取定义此类的二进制字节流
    1. 将这个字节流所代表的静态存储结构转换为方法区的运行时数据结构
    1. 在内存中生成一个代表这个类的 java.lang.Class对象,作为方法区这个类的各种数据和访问入口
      而获取二进制字节流的方式可以有很多种,不一定是通过类的全限名;比如从 ZIP 读取,网络中读取或者动态代理读取等等。
      加载阶段和连接阶段的部分内容,是交叉进行的。

2.2 验证

这一阶段是为了确保 Class 文件中的字节流是否符合当前虚拟机的要求,并且不会伤害到虚拟机自身安全。

2.3 准备

准备阶段正式为类变量分配内存和设置初始值的阶段,这些变量所使用的内存将在方法区中进行分配。

2.4 解析

解析是把符号引用转换为直接引用的过程;在 class 文件格式中,符号引用常常以,CONSTANT_FIELDREF_INFO等等类型的常量出现。

2.5 初始化

初始化是类加载的最后一步,也是真正执行类中定义的 Java 程序代码,初始化阶段是执行类构造器 ()方法的过程。

三、类加载器

从上面看到,类加载阶段中,是通过一个 类的全限定名来获取描述此类的二进制字节流 的,这个动作如果放到外部去做,以便程序自己决定如何去获取所需要的类。我们叫做 “类加载器”。

四、双亲委派模型

它的工程流程是: 当一个类加载器收到类加载的请求,它首先不会自己去尝试加载这个类,而是委派给她的父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载器都会传递到父加载器中;只有父加载器无法完成时,子加载器才会尝试自己去加载.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章