java类型生命周期的详细解析

 更新时间:2013年08月16日 09:27:56   作者:  
以下是对java中的类型生命周期进行了详细的分析介绍,需要的朋友可以过来参考下

开始阶段

装载:把二进制形式的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为pdf添加书签的方法(pdf书签制作)

    使用java为pdf添加书签的方法(pdf书签制作)

    下载一些pdf格式的电子书没有书签,用JAVA写了一个小工具,将特定格式的文本解析成为书签,然后保存到pdf格式中
    2014-02-02
  • VSCode中开发JavaWeb项目的详细过程(Maven+Tomcat+热部署)

    VSCode中开发JavaWeb项目的详细过程(Maven+Tomcat+热部署)

    这篇文章主要介绍了VSCode中开发JavaWeb项目(Maven+Tomcat+热部署),本文分步骤通过图文并茂的形式给大家介绍的非常详细,需要的朋友可以参考下
    2022-09-09
  • springboot上传文件,url直接访问资源问题

    springboot上传文件,url直接访问资源问题

    这篇文章主要介绍了springboot上传文件,url直接访问资源问题。具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • Java实现三子棋小游戏简易版

    Java实现三子棋小游戏简易版

    这篇文章主要为大家详细介绍了Java实现三子棋小游戏简易版,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • mybatis-plus saveOrUpdateBatch踩坑记录

    mybatis-plus saveOrUpdateBatch踩坑记录

    这篇文章主要介绍了mybatis-plus saveOrUpdateBatch踩坑记录,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • 教你怎么用Java通过关键字修改pdf

    教你怎么用Java通过关键字修改pdf

    此方法只适合通过关键字位置,在pdf上添加字符直接上代码,代码比较长,大部分自己的理解都在代码注释中了,需要的朋友可以参考下
    2021-05-05
  • 详解IDEA使用Maven项目不能加入本地Jar包的解决方法

    详解IDEA使用Maven项目不能加入本地Jar包的解决方法

    这篇文章主要介绍了详解IDEA使用Maven项目不能加入本地Jar包的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • 简单捋捋@RequestParam 和 @RequestBody的使用

    简单捋捋@RequestParam 和 @RequestBody的使用

    这篇文章主要介绍了简单捋捋@RequestParam 和 @RequestBody的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • Java CAS机制的一些理解

    Java CAS机制的一些理解

    这篇文章主要介绍了Java CAS机制的相关资料,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下
    2021-05-05
  • IntelliJ IDEA下自动生成Hibernate映射文件以及实体类

    IntelliJ IDEA下自动生成Hibernate映射文件以及实体类

    这篇文章主要介绍了IntelliJ IDEA下自动生成Hibernate映射文件以及实体类,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11

最新评论