类加载子系统
完整图
类加载器子系统作用
类加载器子系统负责从文件系统或者网络中加载Class文件,class文件在文件开头有特定的文件标识。(例如:CA FE BA BY)
ClassLoader只负责class文件的加载,至于它是否可以运行,则由Execution Engine(执行引擎)决定。
加载的类信息存放于一块称为方法区的内存空间。除了类的信息外,方法区中还会存放运行时常量池信息,可能还包括字符串字面量和数字常量(这部分常量信息是Class文件中常量池部分的内存映射)
- class file存在于本地硬盘上,可以理解为设计师画在纸上的模板,而最终这个模板在执行的时候是要加载到JVM当中来根据这个文件实例化出n个一模一样的实例。(实例化出来的实例,存在于堆区,意思是,模板只有一份存在于方法区。)
- class file加载到JVM中,被称为DNA元数据模板,放在方法区。
- 在**.class文件->JVM->最终成为元数据模板**,此过程就要一个运输工具(类装载器Class Loader),扮演一个快递员的角色。(Class Loader起着将类加载进入jvm的快递作用,快递员身份)
类加载的过程 (加载,链接,初始化)
例如下面的一段代码
/**
* 类加载子系统
* @author: 陌溪
* @create: 2020-07-05-8:24
*/
public class HelloLoader {
public static void main(String[] args) {
System.out.println("我已经被加载啦");
}
}
完整的流程图如下所示
加载阶段
通过一个类的全限定名获取定义此类的二进制字节流 (例如: 类.class 获取二进制字节流)
将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构 (看具体jvm的版本,所具体的方法区运行的数据结构不同)
在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口 (在内存中生成类的模板,可以