java类的生命周期
一个java类的完整的生命周期会经历加载、连接、初始化、使用、和卸载五个阶段,当然也有在加载或者连接之后没有被初始化就直接被使用的情况,如图所示:
在一个类编译完成之后,下一步就需要开始使用类,如果要使用一个类,肯定离不开JVM。
在程序执行中JVM通过装载,链接,初始化这3个步骤完成。
装载;是通过类加载器完成的,加载器将.class文件的二进制文件装入JVM的方法区,并且在堆区创建描述这个类的java.lang.Class对象,用来封装数据。
链接:就是把二进制数据组装为可以运行的状态,连接阶段比较复杂,一般会跟加载阶段和初始化阶段交叉进行,这个阶段的主要任务就是做一些加载后的验证工作以及一些初始化前的准备工作,可以细分为
三个步骤:验证、准备和解析。
初始化:连接阶段完成之后会根据使用的情况(直接引用还是被动引用)来选择是否对类进行初始化
使用:初始化之后类的对象就可以正常使用
卸载:直到一个对象不再使用之后,将被垃圾回收,释放空间,当没有任何引用指向Class对象时就会被卸载,结束类的生命周期
链接
链接分为校验,准备,解析这3个阶段
校验:一般用来确认此二进制文件是否适合当前的JVM(版本)
准备:就是为静态成员分配内存空间,并设置默认值
解析:指的是转换常量池中的代码作为直接引用的过程,直到所有的符号引用都可以被运行程序使用(建立完整的对应关系)
连接阶段完成之后会根据使用的情况(直接引用还是被动引用)来选择是否对类进行初始化。
初始化之后类的对象就可以正常使用了,直到一个对象不再使用之后,将被垃圾回收。释放空间。
当没有任何引用指向Class对象时就会被卸载,结束类的生命周期
总结
对象基本上都是在jvm的堆区中创建,在创建对象之前,会触发类加载(加载、连接、初始化),当类初始化完成后,根据类信息在堆区中实例化类对象,初始化非静态变量、非静态代码以及默认构造方法,当对象使用完之后会在合适的时候被jvm垃圾收集器回收。