JVM系列之三:JVM之java类型生命周期详解

本文详细解析了Java类型从二进制数据导入至Java虚拟机的全过程,包括装载、连接、初始化等七个关键阶段,并阐述了对象实例化、垃圾收集及卸载机制。

前一篇文章详细的描述了 java class 文件的格式  。它以标准的二进制形式来表现java 类型。现在我们再来看看当二进制的类型数据被导入到java虚拟机中的生命周期是什么样子的,下文所说的生命周期指的是 java 类型二进制的类型数据被导入到java虚拟机中的生命周期的。

生命周期可分为 装载、连接、初始化、对象实例化、垃圾收集、对象终结以及卸载 7个阶段。接下来我们对这些阶段一一解释。

  1. 装载
    装载由三个基本动作完成:1、通过该类型的完全限定名,产生一个代表该类型的二进制数据流  2、解析这个二进制数据流为方法区的内部数据结构  3、创建一个表示该类型的 java.lang.Class 类的实例。加载的详细过程见 JVM系列之二:ClassLoad 详解

  2. 连接
    连接阶段可分为三个子步骤:验证、准备和解析。验证 步骤确保了Java 类型数据格式正确并且适于Java 虚拟机使用。 准备步骤则负责为该类型分配它所需的内存,设置默认的初始值。解析步骤则负责把常量池中的符号引用转换为直接引用。虚拟机的实现可推迟解析这一步,他可以在 当运行中的程序真正使用某个符号引用时再去解析(把常量池中的符号引用转换为直接引用)。

  3. 初始化
    当验证、准备和(可选的)解析步骤都完成时,该类型就已经为初始化做好了准备,在初始化期间,都将给类变量以适当的初始值。

  4. 对象实例化
    在java程序中,类可以被明确或者隐含的实例化。实例化一个类有四种途径:1、明确的使用new 操作符 2、调用Class 或者 java.lang.reflect.Constructor 对象的 newInstance() 3、调用任何现有对象的 clone() 方法 4、通过 java.io.ObjectInputStream类的 getObject()方法反序列化

  5. 垃圾收集与对象终结
    一个终结方法是一个普通的java方法,他可以直接诶程序所调用。这样的直接调用不会影响垃圾收集齐的自动调用过程。垃圾收集器(最多)只会调用一个对象的终结方法一次——在对象编程不再被引用的之后的某个时候,在占据的对象被重用之前。如果终结方法代码执行后,对象重新被引用了(复活了),随后再次变得不被引用,垃圾收集齐不会第二次调用终结方法。
    垃圾收集器自动调用的 finalize()方法抛出的任何异常都将被忽略。垃圾收集齐可以用任意的顺序调用 finalize() 方法,使用任意线程,升值并行使用多线程。

  6. 卸载
    JVM 装载、连接并初始化类,使程序能使用类,当程序不再引用他们的时候可选的卸载他们。

 

已经博主授权,源码转载自 https://pan.quark.cn/s/a4b39357ea24 QueueForMcu 基于单片机实现的队列功能模块,主要用于8位、16位、32位非运行RTOS的单片机应用,兼容大多数单片机平台。 开源代码:https://.com/xiaoxinpro/QueueForMcu 一、特性 动态创建队列对象 动态设置队列数据缓冲区 静态指定队列元素数据长度 采用值传递的方式保存队列数据 二、快速使用 三、配置说明 目前QueueForMcu只有一个静态配置项,具体如下: 在文件 中有一个宏定义 用于指定队列元素的数据长度,默认是 ,可以根据需要更改为其他数据类型。 四、数据结构 队列的数据结构为 用于保存队列的状态,源码如下: 其中 为配置项中自定义的数据类型。 五、创建队列 1、创建队列缓存 由于我们采用值传递的方式保存队列数据,因此我们在创建队列前要手动创建一个队列缓存区,用于存放队列数据。 以上代码即创建一个大小为 的队列缓存区。 2、创建队列结构 接下来使用 创建队列结构,用于保存队列的状态: 3、初始队列 准备好队列缓存和队列结构后调用 函数来创建队列,该函数原型如下: 参数说明: 参考代码: 六、压入队列 1、单数据压入 将数据压入队列尾部使用 函数,该函数原型如下: 参数说明: 返回值说明: 该函数会返回一个 枚举数据类型,返回值会根据队列状态返回以下几个值: 参考代码: 2、多数据压入 若需要将多个数据(数组)压入队列可以使用 函数,原理上循环调用 函数来实现的,函数原型如下: 参数说明: 当数组长度大于队列剩余长度时,数组多余的数据将被忽略。 返回值说明: 该函数将返回实际被压入到队列中的数据长度。 当队列中的剩余长度富余...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值