Java虚拟机通过装载、连接和初始化一个JAVA类型,使该类型可以被正在运行的JAVA程序所使用,其中,装载就是把二进制形式的JAVA类型读入JAVA虚拟机中;而连接就是把这种读入虚拟机的二进制形式的类型数据合并到虚拟机的运行时状态中去。

连接阶段分为三个子步骤----验证、准备和解析

"验证"步骤确保了JAVA类型数据格式正确并且适用于JAVA虚拟机使用。

"准备"步骤负责为该类型分配它所需的内存,比如为它的类变量分配内存。

"解析"步骤则负责把常量池中的符号引用转换为直接引用。

虚拟机的实现可以推迟解析这一步,它可以在当运行中的程序真正使用某个符号引用时再去解析它(把该符号引用转换为直接引用)。当验证、准备和(可选的)解析步骤都完成了时,该类型就已经为初始化做好了准备。在初始化期间都将给变量赋以适当的初始值。

所有的JAVA虚拟机实现必须在每个类或接口首次主动使用时初始化。下面这六种情况符合主动使用的要求。

(1)当创建某个类的新实例时(或通过在字节码中执行new指令;或者通过不明确的创建、反射、克隆或者反序列化)

(2)当调用某个类的静态方法时(即在字节码中执行invoke、static指令时)

(3)当使用某个类或接口的静态字段,或者对该字段赋值时,用final修饰的静态字段除外,它被初始化为一个编译时的常量表达式。

(4)当调用JAVA API中的某些反射方法时,比如类CLASS中的方法或者java.lang.reflect包中的类方法。

(5)当初始化某个类的子类时(某个类初始化时,要求它的超累已经被初始化了)

(6)当虚拟机启动时被表名为启动类的类(即含有main()方法的那个类)

装载

装载阶段由三个基本动作组成,要装载一个类型,JAVA虚拟机必须:

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

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

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

验证

当类型被装载后,就准备进行连接了。连接过程的第一步是验证---确认类型符合JAVA语言的语义,并且它不会危及虚拟机的完整性。检查被装载的类型是否有任何问题的整个过程都属于验证。

另一个很可能在装载时进行的检查是,确保除了Object之外的每一个类都有一个超类。在装载时检查的原因是当虚拟机装载一个类时,它必须确保该类的所有超类都已经被装载了

在大部分虚拟机实现中,还有一种检查往往发生在正式的验证阶段之后,那就是符号引用的验证。在前面的章节中描述过,动态连接的过程包括通过保存在常量池中的符号引用查找被引用的类、接口、字段以及方法,把符号引用替换成直接引用。当虚拟机搜寻一个被符号引用的(类型、字段或方法)时,它必须首先确认该元素存在。

在正式的验证阶段需要完成的候选检查在下面列出:

(1)检查final的类不能拥有子类。

(2)检查final的方法不能被覆盖。

(3)确保在类型和超类型之间没有不兼容的方法声明(比如两个方法拥有相同的名字,参数再数量、顺序、类型上都相同,但是返回类型不同)这里超类需要在子类初始化前被初始化。

(4)检查所有的常量池入口相互之间一致。

(5)检查字节码的完整性。

(6)检查常量池中的所有的特殊字符串是否符合格式。

准备

在准备阶段,JAVA虚拟机为类变量分配内存,设置默认初始值。但在到达初始化阶段之前,类变量都没有被初始化为真正的初始值。JAVA虚拟机实现可能也为一些数据结构分配内存,目的是提高运行程序的性能。这种数据结构的雷子如方法表,它包含指向类中每一个方法(包括从超类继承的方法)的指针。

解析

类型经过了连接的前两个阶段---之后,它就可以进入解析阶段。解析过程是在类型的常量池中寻找类、接口、字段和方法的符号引用,把这些符号引用替换成直接引用的过程。

初始化

一个类包含两个步骤:

1、如果累存在直接超类的话,且直接超类还没有被初始化,就先初始化直接超类。

2、如果累存在一个类初始化方法,就执行此方法。

当初始化一个类的直接超类的时候,也就是包含这两个步骤。因此,第一个初始化的类永远是Object,然后被主动使用的类的继承树上的所有类。超类总是在子类之前被初始化。

JAVA虚拟机必须确保初始化过程被正确的同步。如果多个线程需要初始化一个类,仅仅允许一个线程来执行初始化,其他的线程需要等待。当活动的线程完成了初始化过程之后,它必须通知其他的等待的线程。

卸载类型

虚拟机创建并初始化对象,使程序能使用对象,然后在对象变得不再被引用后可选地执行垃圾收集。同样,虚拟机装载、连接并初始化类,使程序能使用类,当程序不在引用它们的时候可选地卸载它们。

垃圾收集器必须从可触及的myThread类的对象,通过它在方法去中的类型数据找到可触及的CLASS实例。

从MyThread对象开始,垃圾收集器跟随一个指向MyThread的类型数据的指针,它找到了:

一个指向堆中的MyThread的Class实例的引用。

一个指向MyThread的直接超接口Cloneable的类型数据的指针。

一个指向MyThread的直接超类Thread的类型数据的指针。

从Cloneable的类型数据开始,垃圾收集器找到了:

一个指向堆中Cloneable的Class实例的引用

从Thread的类型数据开始,垃圾收集器找到了:

一个指向堆中Thread的Class实例的引用。

一个指向Thread的直接超接口Runnable的类型数据的指针。

一个指向Thread的直接超类Object的类型数据的指针。

从Runnable的类型数据开始,垃圾收集器找到了:

一个指向堆中Runnable的Class实例的引用。

从Object的类型数据开始,垃圾收集器找到了:

一个指向堆中Object的Class实例的引用。

仅仅一个可触及的MyThread的实例,垃圾收集器就可以触及MyThread和它所有超类型的Class实例。

参考:《深入java虚拟机》

JVM 类型的生命周期学习相关推荐

  1. Page 的生命周期学习小结

    (以前我在 csdn 写的翻译文章,现在转到这里来.) Page 的生命周期学习小结 原文链接:Page Events: Order and PostBack 作者:Paul Wilson 翻译:木野 ...

  2. 页面生命周期_微信小程序的生命周期学习笔记-应用篇

    在我们学习微信小程序的过程当中,我们会参考很多资料.在这些资料中,我们经常能够看到"生命周期"四个字,在前面的课程中也提到过.在这里做一个说明. 生命周期是一类函数的统称,这些函数 ...

  3. 测试Servlet生命周期学习笔记

    测试环境:windows xp旗舰版 软件环境:myclipse8.5+tomcat7.0 ****************************************************** ...

  4. 四种类型项目管理生命周期

    一般来说,可以将项目生命周期分为以下几种类型: 1. 瀑布式项目生命周期 瀑布式项目生命周期是一种比较传统的项目管理方法,将整个项目分为一系列顺序进行的独立阶段,每个阶段都是由前一个阶段的成果来推动, ...

  5. 软件测试基础知识(二)------------等价类划分法、边界值分析法、场景法、错误推测法、bug定义/类型/优先级/生命周期/跟踪管理

    等价类划分法 是把程序的输入域划分成若干个子集合(等价类),然后从每个子集合(等价类)中选取少数具有代表性的数据作为测试的输入数据. 在该子集合中,所有的输入数据对于揭露软件中的错误都是等效的.--- ...

  6. @kubernetes(k8s)的kubectl的使用及资源类型pod生命周期与资源清单详解

    文章目录 kubernetes 一.kubernetes kubectl的使用 1.kubectl 的概述: 2.kubectl的使用 2.kubectl可操作的资源对象类型 3.kubectl子命令 ...

  7. React Native之组件(Component)生命周期学习笔记

    1.Component介绍 一般Component需要被其它类进行继承,Component和Android一样,也有生命周期 英文图片如下 2   具体说明 1).挂载阶段 constructor() ...

  8. react生命周期学习

    一.初始化 (1)getDefaultProps() getDefaultProps这种定义方式是用在定义组件时用的是React.createClass方式的如果使用的是es6的语法,例如用的是cla ...

  9. Activity生命周期学习总结

    1:Android Activity 生命周期图 Activity作为Android的四大组件之一,是比较重要的,下图就是Activity 的生命周期的过程 2:四个状态 [running-pouse ...

最新文章

  1. IOS数据存储之文件沙盒存储
  2. 存在就不插入_DOM 插入节点和三个Child方法
  3. 两个列表之间移动数据
  4. The difference between synchronous and asynchronous code in JavaScript
  5. c#如何使用反射去创建一个委托_【自学C#】|| 笔记 37 创建线程
  6. php 函数 数组 难学,php 数组的常用函数
  7. 如何成为一个Java高薪架构师?
  8. C语言实现简单的单例模式
  9. java里面的三角函数
  10. 赛锐信息:SAP系统用户账号类型介绍
  11. 如何查看数据库是否是rac,如何查看数据库是否是单实例
  12. python numpy数组切片_python中numpy数组切片实验解释
  13. TCP握手协议的巧计方法
  14. python超市管理系统实训报告_需求分析实验报告(小型超市管理系统)
  15. 2014美团校园招聘笔试(10.8北京)
  16. [翻译]CryEngine3中ClothShader详解
  17. 写在2020年的初秋
  18. Premiere Pro之字幕添加(三)
  19. 采购工作的基本内容和注意事项
  20. 人类基因编辑技术及背后的伦理问题 【个人观点,仅供参考】

热门文章

  1. Yii2 mongodb 扩展的where的条件增加大于 小于号
  2. Python爬虫1-----------placekitten 入门
  3. TimerTask定时任务
  4. 无忧开通了博客园博客主页
  5. headroom.js插件使用方法
  6. HFileOutputFormat与TotalOrderPartitioner
  7. 2012-04-12
  8. NET中使用Memcached的相关资源整理
  9. 摩托罗拉周二将正式分拆为两经营实体
  10. matlab som聚类算法,使用SOM对数据进行聚类