类加载机制
1、加载:查找并加载类的二进制数据,在加载阶段,虚拟机需要完成以下三件事情
1、通过一个类的全限定名来获取其定义的二进制字节流
2、将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构
3、在Java堆中生成一个代表这个类的java.lang.Class对象,作为对方法区中这些数据的访问入口
2、连接
1、验证:确保被加载类的正确性
2、准备:为类的静态变量分配内存,并将其初始化为默认值
1、这个阶段进行内存分配的仅包括类变量,而不包括实例变量,实例变量会在对象实例化时随着对象一块被分配在Java堆中
2、这里所设的初始值通常情况下是数据类型默认的零值,而不是被在Java代码中被显式地赋予的值
3、同时被static final修饰的变量,才会在这个阶段被赋值(程序中所设定的值)
3、解析:把类中符号引用替换成直接引用
3、初始化
JVM初始化步骤:
1、假如这个类还没有被加载和连接,则程序先加载并连接该类
2、加入这个类的父类还没有被初始化,则先初始化其直接父类
3、假如类中有初始化语句,则系统依次执行这些初始化语句
JVM负责开始对类进行初始化,主要对类变量进行初始化,在Java中对类变量进行初始值设定有两种方式:
1、声明类变量时指定初始值
2、使用静态代码块为类变量指定初始值
类初始化时机:
1、创建类的实例,也就是new的方式
2、访问某个类或接口的静态变量,或者对该静态变量赋值
3、调用类的静态方法
4、反射,如Class.forName()
5、初始化某个类,其父类也会被初始化
6、Java虚拟机启动时被标明为启动类的类(Java Test),直接使用java.exe命令来运行某个主类
4、使用
5、卸载