类的生命周期
装载-》链接 -》初始化 -》使用 -》 卸载
装载
- ClassFile -> 字节流 -> 类加载器
- 将这个字节流所代表的的静态存储结构转换成方法区的运行时数据结构 引用 -> 对象 -> 数据
- 在java的堆中生成一个代表这个类的java.lang.Class对象,作为对于方法区中的这些数据的访问入口
链接:
- 验证 验证文件的正确性,文件格式、元数据(对java语法验证)、字节码(数据流以及控制流的分析,运行时检查,栈数据类型和操作码)、符号引用(符号引用转变为直接引用)等
- 准备 为类的静态变量分配内存,并且赋予当前类型的默认值
- 解析 从运行时常量池中的符号引用动态确认具体值的过程,符号引用转变为直接引用的过程
初始化Clinit执行了类的初始化方法,初始化你的静态变量、赋值
初始化静态代码块
初始化父类
类加载器,用来加载类的,优先加载源码

初始化:
执行类构造器方法的过程
1、声明类变量为指定的初始值
2、使用静态代码块为类变量赋值(静态变量放在静态代码块前)
3、如果这个类还没有被夹在和链接,则程序先加载并链接该类
4、如果该类的父类还没有初始化,则先初始化其直接父类
5、如果类中有初始化语句,写系统依次执行这些初始化语句
使用
主动引用:
1、创建类的实例,也就是new的方式
2、访问某个类或接口的静态变量,或者对静态变量赋值
3、调用类的静态方法
4、反射
5、初始化某个类的子类,则该类也会被初始化
6、Java虚拟机启动时标明为启动类的类,直接使用java.exe命令来运行某个主类
被动引用:
1、引用父类的静态字段,只会引起父类的初始化,而不会引起子类的初始化
2、定义类数组,不会引起类的初始化
3、引用类的static final常量,不会引起类的初始化(如果只有static修饰,还是会引起该类初始化的)
卸载:
1、该类的所有实例已经被回收,也就是java堆中不存在该类的任何实例
2、加载该类的ClassLoader已经被回收
3、该类对应的java.long.Class对象没有任何地方被应用,无法在任何地方通过反射访问该类的方法
如果满足以上三个条件,jvm就会在方法区垃圾回收的时候对垒进行卸载,类的卸载过程其实就是在方法区中清空类信息,java类的整个声明周期就结束了。但是一般情况下启动类加载器加载的类不会被卸载,而我们的其他两种基础类型的类加载器只有在极少数情况下才会被卸载

被折叠的 条评论
为什么被折叠?



