java类型生命周期的详细解析
java类型生命周期的详细解析
发布时间:2016-12-28 来源:查字典编辑
摘要:开始阶段装载:把二进制形式的java类型读入jvm中。1)通过该类型的完全限定名,产生一个代表该类型的二进制数据流;2)解析这个二进制数据流...

开始阶段

装载:把二进制形式的java类型读入jvm中。

1)通过该类型的完全限定名,产生一个代表该类型的二进制数据流;

2)解析这个二进制数据流为方法区内的内部数据结构;

3)创建一个表示该类型的java.lang.Class类的实例;

连接:把已读入的类型数据合并到虚拟机的运行时状态中。

1)验证:确保java类型数据格式正确并且适用于jvm使用;

2)准备:为该类型分配内存;

3)解析:把常量池中的符号引用转换为直接引用;

初始化:每个类和接口在首次主动使用时初始化。为类变量赋予正确的初始值;

1)如果类存在直接超类,且直接超类没有被初始化,先初始化直接超类;

2)如果类存在初始化方法,就执行此方法;

只有六种活动被认为是主动使用:

1)、创建类的新实例

2)、调用类中声明的静态方法

3)、操作类或者接口中声明的非常量静态字段

4)、调用Java API中特定的反射方法

5)、初始化一个类的子类

6)、指定一个类作为jvm启动时的初始化类

使用阶段(绝大部分时间)

实例化

实例化途径

明确实例化一个类的四种途径:

1)、new操作符;

2)、调用Class或者Java.lang.reflect.Constructor对象的newInstance()方法;

3)、调用任何现有对象的Clone()方法;

4)、通过java.io.ObjectInputStream类的getObject()方法反序列化;

隐含实例化的几种途径:

1)、保存命令行参数的String对象;

2)、和类装载相关,jvm装载的每一个类型,会暗中实例化一个Class对象来代表这个类型;

3)、和类装载相关,当jvm装载了在常量池中包含CONSTANT_String_info入口类的时候,会创建新的String对象的实例来表示这些常量字符串;

4)、通过执行包含字符串连接操作符的表达式产生对象;

实例化步骤

1)、在堆中为保存对象的实例变量分配内存;

2)、为实例变量初始化为默认的初始值;

3)、为实例变量赋正确的初始值,有三种技术完成赋值:

a)、如果对象是clone() 创建的,jvm把原实例变量中的值拷贝到新对象中;

b)、如果是通过ObjectInputStream类的readObject()调用反序列化的,jvm从输入流中读取的值来初始化实例变量;

c)、jvm调用对象的实例化方法把对象的实例变量初始化为正确的初始值;

垃圾收集和对象终结

jvm实现必须具有某种自动堆存储管理策略,大部分是使用垃圾收集器。如果类声明了 void finalize()方法,垃圾收集器在释放实例内存前会执行这个方法。

垃圾收集器自动调用的finalize()方法抛出的任何异常都将被忽略。

结束阶段

从jvm中卸载类型

很多情况,jvm中类的生命周期和对象的生命周期很相似。jvm如何判断动态装载的类型是否仍然被程序使用,其判断方式和判断对象是否仍然被使用很相似。

如果程序不再引用某类型,那么类型就是不可触及的,就可以被卸载。

使用启动类装载器装载的类型永远都是可触及的,所以永远不会被卸载。只有使用用户定义的类装载器装载的类型才会变成不可触及,才会被卸载。

推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
相关阅读
网友关注
最新Java学习
热门Java学习
编程开发子分类