JVM 类型的生命周期学习

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虚拟机》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/284896.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

js对象数组中的某属性值 拼接成字符串

var arr[{id: "600", pId: null, name: "图形的变化"},{id: "630", pId: "600", name: "投影与视图"},{id: "631", pId: "630", name: "投影"},{id: "632", pId: "630",…

开店星简直就是国内优秀的开源商城系统天花板

一、场景 1、大学生毕业设计做商城系统背景 好家伙、又到开学季节了,师妹让我帮忙给指导大四的项目,作为毕业设计和为后面找工作积累项目经验,要搞一个买卖二手闲置品的商城小程序和PC端商城、希望能够快速学习、接入、修改部分功能&#xff…

【CASS精品教程】CASS9.1土方量的计算方法汇总

CASS9.1中,计算土方量的方法有:DTM法土方计算、断面法进行土方量计算、方格网法土方计算、等高线法土方计算、区域土方量平衡等。本文以案例的形式,详细讲解土方量的计算过程。 文章目录 一、DTM法土方计算二、断面法进行土方量计算三、方格网法土方计算四、等高线法土方计算…

VS2019 禁止Web项目停止调试后自动关闭浏览器(在浏览器窗口关闭时停止调试程序,在调试停止时关闭浏览器)

很多文章都说要修改以下两处与“编辑并继续”有关的选项: “编辑并继续”是一种省时的功能,使你能够在程序处于中断模式时更改源代码。 通过选择执行命令(如 "继续" 或 "单步执行")继续执行程序时&#xff0c…

【ArcGIS风暴】ArcGIS中等高线高程标注/注记(打断/消隐)方法案例汇总

本文以案例的形式,图文并茂详细讲解在ArcGIS 10.6中,等高线高程标注、注记的方法。 文章目录 一、属性标注二、Maplex工具标注1. 使用Maplex标注引擎2. 标注转换为注记3. 要素轮廓线掩膜4. 使用掩膜选项进行绘制参考阅读: 【CASS精品教程】CASS9.1等高线的绘制完整案例教程 …

Blazor University (35)表单 —— 编写自定义验证

原文链接:https://blazor-university.com/forms/writing-custom-validation/编写自定义验证源代码[1]请注意,与有关 EditContext、FieldIdentifiers 和 FieldState[2] 的部分一样,这是一个高级主题。如前所述,FieldState 类保存表…

HTML 元素内部添加预加载

CSS: /*元素内部加载loading*/.innerLoading {height: 100%;width: 100%;display: flex;justify-content: center;align-items: center;}.innerLoading * {text-align: center;color: #737782cc;fill: #73777A;font-size: 1em !important;font-family: SimSun,SimHe…

Windows下怎样安装Tomcat

Tomcat 是开源的WEB应用容器,所以受到各位程序员和公司的亲赖。在这里给大家介绍一下如何在Windows环境下安装Tomcat绿色版本,希望能够对大家有帮助。 1.首先去Tomcat官网下载Tomcat软件,在百度中搜索Tomcat,进入英文网址http://tomcat.apach…

智能识别云服务端平台之神【合合信息TextIn】

一、前言 众所周知,随着互联网和人工智能的发展,我们非常多的场景需要用到智能“识别”功能,比如人脸识别、通用文字识别、表格识别、办公文档识别、身份证、名片、营业执照等国内外卡证文字识别等等,同时识别与理解面临的全球性技…

【ArcGIS微课1000例】0015:ArcGIS如何创建/自定义快捷键?

为了提高工作效率,强大的ArcGIS提供了很多快捷键,如访问 ArcMap 菜单命令、窗口操纵、刷新或暂停地图绘制、通过拖放进行移动或复制等等。本文在ArcGIS已有快捷键的基础之上,为了提高工作效率,讲解如何定制个性化的快捷键。 参考阅读:【ArcGIS风暴】ArcGIS快捷键大全 文章…

Bresenham 算法

1965 年,Bresenham 为数字绘图仪开发了一种绘制直线的算法,该算法同样使用于光栅扫描显示器,被称为 Bresenham 算法。 原理 算法的目标是选择表示直线的最佳光栅位置。Bresenhan 算法在主位移方向上每次递增一个单位。另一个方向的增量为 0…

ML.NET 更新

点击上方蓝字关注我们(本文阅读时间:5分钟)ML.NET是一款面向.NET开发人员的开源,跨平台机器学习框架,可以将自定义机器学习集成到.NET应用中。我们很开心地向您介绍我们在过去几个月中所做的工作。ML.NET:https://dotnet.microsof…

Andriod之提示java.lang.SecurityException: getDataNetworkTypeForSubscriber导致程序奔溃

1、问题 修改targetSdkVersion 33 适配Android13后4G网络环境被其它app拉起来提示这个异常 2、原因 我们定位到代码在这行函数 telephonyManager.getNetworkType()Android11 的权限有关,由于缺少该权限导致无法访问接口而提示安全异常 3、解决办法 方法1:我们直接申请RE…

[译]基于GPU的体渲染高级技术之raycasting算法

[译]基于GPU的体渲染高级技术之raycasting算法 PS:我决定翻译一下《Advanced Illumination Techniques for GPU-Based Volume Raycasting》。像我翻译其他资料一样,只按我的需要和观点来翻译。有的部分详细翻译,附加注解,有的部分…

【GIS风暴】什么是地理空间智能(Geospatial AI)?

人工智能(Artificial Intelligence,AI)已经成为新技术革命下一阶段的热词,也成为未来产业的驱动力量。使用智能算法,数据分类和智能预测、分析,AI在很多领域将有一系列的工具来帮助解决问题。 将AI用于GIS这一具体的领域的分析、方法和解决方案,就叫地理空间智能(Geos…

JavaScript 清除图片背景颜色 使之透明

主要JS /**清除图片背景颜色 **/ function removeImgBg(img) {//背景颜色 白色const rgba [255, 255, 255, 255];// 容差大小const tolerance 60;var imgData null;const [r0, g0, b0, a0] rgba;var r, g, b, a;const canvas document.createElement(canvas);const cont…

day01基础部分

一、python是什么样的语言 1、编译型语言和解释型语言,python是解释型语言 1.1、编译型语言就是把源程序代码一次性翻译成机器码(计算机可识别的代码),然后交给计算机去运行,一般需经过编译(compile&#x…

WPF 制作 Windows 屏保

分享如何使用WPF 制作 Windows 屏保WPF 制作 Windows 屏保作者:驚鏵原文链接:https://github.com/yanjinhuagood/ScreenSaver框架使用.NET452;Visual Studio 2019;项目使用 MIT 开源许可协议;更多效果可以通过GitHub[1]|码云[2]下…

Windows 7 下右键发送到菜单项没了

为什么80%的码农都做不了架构师?>>> 问题描述: 突然有一天,Windows 7 下右键发送到菜单项没了,如图所示: 问题原因 黑人问号脸? 转载于:https://my.oschina.net/taadis/blog/1591398

【ArcGIS微课1000例】0016:ArcGIS书签操作(添加书签、管理书签)知多少?

书签可以将地图数据的某一视图状态保存起来,以便在使用时打开书签,直接回到这一视图状态。可创建多个书签以便快速回到不同的视图状态,也可以对书签进行管理。 文章目录 1 创建书签2 管理书签注意:书签只针对空间数据,在【布局视图】中是不能创建书签的。 1 创建书签 可…