概述:类只被加载一次且被动态加载至JVM中,因为一次性加载所有类会占用很多内存,所以JVM不会一次性加载所有类。
类的生命周期:
- 加载
- 通过类的完全限定名称获取定义该类的二进制字节流
- 将该字节流表示的静态存储结构转换为Metaspace源空间去的运行时存储结构
- 在内存中生成一个代表该类的Class对象,作为元空间区中该类各种数据的访问入口
- 验证
- 确保Class文件的字节码符合当前虚拟机的要求,可以被执行
- 准备
- 被Static修饰的变量为类变量,在准备阶段将为类变量分配内存地址并且设置初始值,使用的是元空间的内存
- 类加载只进行一次在所有实例化操作之前,实例化可以进行很多次实例变量随着对象一起被分配在堆中
- 初始值一般为0值
- 解析
- 将常量池的符号引用替换为直接引用的过程
- 初始化
- 初始化阶段是虚拟机执行类构造器<clinit>()方法的过程
- <clinit>()是由编辑器自动收集类中所有类变量的赋值动作和静态语句块中的语句合并产生的;静态语句块只能访问到定义在它之前的类变量,定义在它之后的类变量只能赋值,不能访问
- 使用
- 卸载
类初始化时机
1.主动引用
2.被动引用
类与类加载器
类加载器的分类:
1.启动类加载器
2.扩展类加载器
3.应用程序类加载器
4.自定义类加载器
双亲委派模型:在实现类加载时,必须先进行双亲委派模型的验证,如果在“双亲”中存在该类则不用再进行加载
对象创建过程:
1.类加载检查
2.分配内存
3.初始化零值
4.设置对象头
5.执行init方法