一个类从加载到内存到垃圾回收的全过程是什么【类加载机制+对象回收】

一、类加载机制

类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:
加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)初始化(Initialization)、使用(Using)和卸载(Unloading)7个阶段。
其中准备、验证、解析3个部分统称为连接(Linking)。

1.1 加载

首先通过一个类的全限定名来获取此类的二进制字节流;其次将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构;最后在java堆中生成一个代表这个类的Class对象,作为方法区这些数据的访问入口。总的来说就是查找并加载类的二进制数据。

1.2 链接

1.验证:检查加载到的字节信息是否符合JVM规范。
2.准备:创建类或接口的静态变量,并赋初始值 半初始化状态
3.解析:把类中的符号引用转换为直接引用;

1.3 类的初始化

(1)类什么时候才被初始化
1)创建类的实例,也就是new一个对象
2)访问某个类或接口的静态变量,或者对该静态变量赋值
3)调用类的静态方法
4)反射(Class.forName(“com.lyj.load”))
5)初始化一个类的子类(会首先初始化子类的父类)
6)JVM启动时标明的启动类,即文件名和类名相同的那个类
(2)类的初始化顺序
1)如果这个类还没有被加载和链接,那先进行加载和链接
2)假如这个类存在直接父类,并且这个类还没有被初始化(注意:在一个类加载器中,类只能初始化一次),那就初始化直接的父类(不适用于接口)
3)加入类中存在初始化语句(如static变量和static块),那就依次执行这些初始化语句
4)总的来说,初始化顺序依次是:(静态变量、静态初始化块)–>(变量、初始化块)–> 构造器;
果有父类,则顺序是:父类static方法 –> 子类static方法 –> 父类构造方法- -> 子类构造方法

二、对象回收

简单:
1、用户创建一个对象,JVM首先需要到方法区去找对象的类型信息。然后再创建对 象。
2、JVM要实例化一个对象,首先要在堆当中先创建一个对象。-> 半初始化状态
3、对象首先会分配在堆内存中新生代的Eden。然后经过一次Minor GC,对象如果 存活,就会进入S区。在后续的每次GC中,如果对象一直存活,就会在S区来回拷 贝,每移动一次,年龄加1。-> 多大年龄才会移入老年代? 年龄最大15, 超过一 定年龄后,对象转入老年代。
4、当方法执行结束后,栈中的指针会先移除掉。
5、堆中的对象,经过Full GC,就会被标记为垃圾,然后被GC线程清理掉。

猜你喜欢

转载自blog.csdn.net/wyn_365/article/details/120317545