JVM中类型的生命周期

**

一.概述

**
之前读过两本比较好的JVM书籍,一本是《深入JAVA虚拟机》,一本是《深入理解JAVA虚拟机》,个人理解相对来说第一本比较容易入门理解,第二本更加深入。再次阅读的时候发现对一些章节的理解还是有待提升,希望通过记载读后感的形式,进一步深入理解,并方便复习。本篇博客是《深入JAVA虚拟机》中的第七章《类型的生命周期》的个人理解。

二.类型的生命周期

   指的是Java类型(类或接口)的生命周期(从它进入虚拟机开始一直到最终退出),具体步骤是开始阶段的装载、连接和初始化以及占Java类型生命周期绝大部分时间的对象实例化、垃圾收集和对象终结,生命周期的结束也就是从虚拟机中卸载。

**

三.开始阶段的装载、连接和初始化

**

 经过这个阶段,类型可以被正在运行的Java程序所使用

**1.装载:**把二进制形式的Java类型读入Java虚拟机中
**2.连接:**分为三个阶段(验证,准备,解析)把经过装载的二进制形式的数据合并到虚拟机的运行时状态中去。“验证”:确保Java类型数据格式正确并适合于Java虚拟机使用。“准备”:为该类型分配它所需的内存,比如为它的类变量分配内存,设置默认初始值(不是程序中的初始值,是虚拟机决定的初始值)。“解析”:负责把常量池中的符号应用转换为直接应用,这个步骤可以推迟,可以在运行中的程序真正使用某个符号应用时再解析。
**3.初始化:**给类变量赋以适当的初始值(程序员希望的这个类变量所具备的起始值,类变量初始化语句或者静态初始化语句),Java编译器收集初始化语句放在特殊的方法< clinit >中,虚拟机才能调用此方法。并非所有类都有这个方法,初始化步骤 ,接口没有步骤1,不需要初始化超类
1>如果类存在直接超类的话,且直接超类还没有被初始化,就先初始化直接超类。
2>.如果类存在一个类初始化方法,就执行次方法。

**

三.对象的生命周期

**
经过以上步骤,程序就能够访问它的静态字段,调用它的静态方法,或者创建它的实例。
**1.明确地类实例化的四种途径:**new操作符,class或者java.lang.reflect.Constructor对象的newInstance()方法;clone()方法;java.io.ObjectInputSream类的getObject()方法反序列化。
隐含实例化这里不做描述,篇幅太长。
2.在堆中为保存对象的实例变量分配内存,所有在对象的类中和它的超类中声明的变量都要分配内存。
3.虚拟机为实例变量赋正确的初始值,可以通过clone()方法,readobject()反序列化,输入流中读入的值进行初始化。否则通过调用对象的初始化方法,class文件中,这个实例初始化方法为< init >.,这个方法对应类中的构造方法,必须是存在的,如果不存在,则为空的构造方法。

**4.垃圾收集和对象的终结:**虚拟机实现必须具有某种自动堆存储管理策略----大部分是采用垃圾收集器。当一个对象不在为程序所用了,虚拟机必须回收内存。如果类声明了一个名为finalize()的返回为void的方法,垃圾收集器会在释放这个实例所占据的内存空间之前执行这个方法一次,而且只执行一次。

5.卸载类型:在很多方面,Java虚拟机中类的生命周期和对象的生命周期很相似。虚拟机创建并初始化对象是程序能够使用对象,然后在对象变得不在被引用后可选地执行垃圾回收。同样,虚拟机装载、连接并初始化类,使程序能使用类,当程序不再引用的时候可选地卸载他们。

**贴士:**使用启类装载器装载的类型永远是可触及的,所以永远不会被卸载。只有时候用户定义的类装载器装载的类型才会变成不可触及的,从而被虚拟机回收。

猜你喜欢

转载自blog.csdn.net/yulungggg/article/details/86499548