1.1类加载:读所谓类加载就是将类从磁盘或网络到JVM内存,然后交给执行引擎执行
1.2JAVA类生命周期:类的生命周期指的是从加载到卸载的基本过程,此过程包含7个阶段,
加载、验证、准备、解析、初始化、 使用、卸载
1)加载、验证、准备和初始化发生顺序是确定的,而解析阶段则 不一定。
2)加载、验证、准备和初始化这四个阶段按顺序开始不一定按顺序完成。
2.1.1加载基本步骤分析
1)通过一个类的全限定名(类全名)来获取其定义的二进制字节流。
2)将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。
3)在java堆中生成一个代表这个类的java.lang.Class对象,作为对 方法区中这些数据的访问入口
2.12.加载路径分析
JVM从何加载我们要使用的类呢?主要从如下三个地方:
1)JDK类库中的类
2)第三方类库中的类
3)应用程序类库中的类
2.1.3.加载方式
JVM中的类加载方式主要两种:隐式加载和显示加载
1)隐式加载
a)访问类的静态成员(例如类变量,静态方法)
b)构建类的实例对象(例如使用new关键字构建对象或反射构建对象)
c)构建子类实例对象(构建类的对象时首先会加载父类类型)
2)显示加载
a)ClassLoader.loadClass(..)
b)Class.forName(..)
可通过运行指定参数,查看类的加载顺序
2.2.1验证
这一阶段的目的是为了确保Class文件的字节流中包含的信息符合当前虚拟机的
要求,并且不会危害虚拟机自身的安全
验证阶段大致会完成4个阶段的检验动作
1)文件格式的验证
2) 元数据验证
3)字节码合法性验证
4)符号引用验证
2.2.2准备
准备阶段是正式为类变量分配内存并设置类变量初始值的阶段,这些内存都将在
方法区中分配。
1)类变量(static)内存分配
2)按类型进行初始默认值分配(如:0、0L、null、false等)。
3)如果字段同时被final和static修饰,那么在准备阶段变量value就会被初始化为指定的值。
2.2.3解析
解析阶段是虚拟机将常量池内符号引用替换为直接引用的过程,其中:
1)符号引用:就是一组符号来描述目标,可以是任何字面量
2)直接引用:就是直接指向目标的指针、相对偏移量或一个间接定位到目标的句柄。
2.3.初始化分析
此阶段为类加载的最后一个阶段,这个阶段我们让自定义类加载器参与进来,其余
阶段完全有JVM主导。
在java中,对类变量进行初始化值的设定有两种方式:
1)声明类变量时指定初始值。
2)使用静态代码块为类变量指定初始值
说明:只有当对类的主动使用的时候才会导致类的初始化
java程序对类的使用方式可以分为两种:
主动使用:会执行加载、连接、初始化静态域
被动使用:只执行加载、连接,不初始化静态域
如果子类引用父类的静态字段,为子类的被动使用,不会导致子类初始化