类的生命周期:
加载——链接——初始化——使用——卸载;
链接中再分 验证——准备——解析
今天先整理加载的过程
“加载”是Class Loading 过程的第一步,通过类加载器实现,也包含用户自定义的类加载器。
加载过程中jvm做了三件事情
- 通过⼀个类的全限定名来获取定义此类的⼆进制字节流(class⽂件)在程序运⾏过程中,当要访问⼀个类时,若发现这个类尚未被加载,并满⾜类初始化的条件 时,就根据要被初始化的这个类的全限定名找到该类的⼆进制字节流,开始加载过程
- 将这个字节流的静态存储结构转化为⽅法区的运⾏时数据结构
- 在内存中创建⼀个该类的java.lang.Class对象,作为⽅法区该类的各种数据的访问⼊⼝,程序在运⾏中所有对该类的访问都通过这个类对象,也就是这个Class对象是提供给外界访问该类的接⼝。
java加载来源一般是class文件,但也可以从zip包,jsp文件中生成的Class类,数据库,网络和运行时计算生成等途径来加载。
加载过程的注意点
- JVM规范并未给出类在⽅法区中存放的数据结构
类完成加载后,⼆进制字节流就以特定的数据结构存储在⽅法区中,但存储的数据结构是由虚拟机⾃⼰定义的,虚拟机规范并没有指定。
- JVM规范并没有指定Class对象存放的位置
在⼆进制字节流以特定格式存储在⽅法区后,JVM会创建⼀个java.lang.Class类的对象,作为本类
的外部访问接⼝。既然是对象就应该存放在Java堆中,不过JVM规范并没有给出限制,不同的虚拟机根据⾃⼰的需求存放这个对象。HotSpot将Class对象存放在⽅法区。
- 加载阶段和链接阶段是交叉的
类加载的过程中每个步骤的开始顺序都有严格限制,但每个步骤的结束顺序没有限制。也就是说,类加载过程中,必须按照如下顺序开始: 加载 -> 链接 -> 初始化;但结束顺序⽆所谓,因此由于每个步骤处理时间的⻓短不⼀就会导致有些步骤会出现交叉。