类的加载过程

Java源代码被编译成class字节码,JVM把描述类数据的字节码.Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的java类型,这就是虚拟机的类加载机制。
类从被加载到虚拟机内存中开始,到卸载出内存为止,它的生命周期包括了:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)、卸载(Unloading)七个阶段,其中验证、准备、解析三个部分统称链接。
加载(装载)、验证、准备、初始化和卸载这五个阶段顺序是固定的,类的加载过程必须按照这种顺序开始,而解析阶段不一定;它在某些情况下可以在初始化之后再开始,这是为了运行时动态绑定特性(也称为动态绑定或者晚期绑定,例如重写)。
1.加载:
在加载阶段,虚拟机主要完成三件事:
1.通过一个类的全限定名来获取定义此类的二进制字节流。
2.将这个字节流所代表的静态存储结构转化为方法区域的运行时数据结构。
3.在Java堆中生成一个代表这个类的java.lang.Class对象,作为方法区域数据的访问入口
相对于类加载过程的其他阶段,加载阶段(准备地说,是加载阶段中获取类的二进制字节流的动作)是开发期可控性最强的阶段,因为加载阶段可以使用系统提供的类加载器(ClassLoader)来完成,也可以由用户自定义的类加载器完成,开发人员可以通过定义自己的类加载器去控制字节流的获取方式。
加载阶段完成后,虚拟机外部的二进制字节流就按照虚拟机所需的格式存储在方法区之中,方法区中的数据存储格式有虚拟机实现自行定义,虚拟机并未规定此区域的具体数据结构。然后在java堆中实例化一个java.lang.Class类的对象,这个对象作为程序访问方法区中的这些类型数据的外部接口。
2.验证:
验证阶段作用是保证Class文件的字节流包含的信息符合JVM规范,不会给JVM造成危害。如果验证失败,就会抛出一个java.lang.VerifyError异常或其子类异常。验证过程分为四个阶段
1.文件格式验证:验证字节流文件是否符合Class文件格式的规范,并且能被当前虚拟机正确的处理。
2.元数据验证:是对字节码描述的信息进行语义分析,以保证其描述的信息符合Java语言的规范。
3.字节码验证:主要是进行数据流和控制流的分析,保证被校验类的方法在运行时不会危害虚拟机。
4.符号引用验证:符号引用验证发生在虚拟机将符号引用转化为直接引用的时候,这个转化动作将在解析阶段中发生。
3.准备:
准备阶段为变量分配内存并设置类变量的初始化。在这个阶段分配的仅为类的变量(static修饰的变量),而不包括类的实例变量。对已非final的变量,JVM会将其设置成“零值”,而不是其赋值语句的值:
pirvate static int size = 12;
那么在这个阶段,size的值为0,而不是12。 final修饰的类变量将会赋值成真实的值。
4.解析:
解析阶段是虚拟机常量池内的符号引用替换为直接引用的过程。
符号引用:符号引用是一组符号来描述所引用的目标对象,符号可以是任何形式的字面量,只要使用时能无歧义地定位到目标即可。符号引用与虚拟机实现的内存布局无关,引用的目标对象并不一定已经加载到内存中。
直接引用:直接引用可以是直接指向目标对象的指针、相对偏移量或是一个能间接定位到目标的句柄。直接引用是与虚拟机内存布局实现相关的,同一个符号引用在不同虚拟机实例上翻译出来的直接引用一般不会相同,如果有了直接引用,那引用的目标必定已经在内存中存在。
虚拟机规范并没有规定解析阶段发生的具体时间,只要求了在执行anewarry、checkcast、getfield、instanceof、invokeinterface、invokespecial、invokestatic、invokevirtual、multianewarray、new、putfield和putstatic这13个用于操作符号引用的字节码指令之前,先对它们使用的符号引用进行解析,所以虚拟机实现会根据需要来判断,到底是在类被加载器加载时就对常量池中的符号引用进行解析,还是等到一个符号引用将要被使用前才去解析它。
解析的动作主要针对类或接口、字段、类方法、接口方法四类符号引用进行。分别对应编译后常量池内的CONSTANT_Class_Info、CONSTANT_Fieldref_Info、CONSTANT_Methodef_Info、CONSTANT_InterfaceMethoder_Info四种常量类型。
1.类、接口的解析
2.字段解析
3.类方法解析
4.接口方法解析
5.初始化:
类的初始化阶段是类加载过程的最后一步,在准备阶段,类变量已赋过一次系统要求的初始值,而在初始化阶段,则是根据程序员通过程序制定的主观计划去初始化类变量和其他资源,或者可以从另外一个角度来表达:初始化阶段是执行类构造器
6.使用:
新线程---程序计数器----jvm栈执行(对象引用)-----堆内存(直接引用)----方法区
7.卸载:
GC垃圾回收
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!
# jvm加载类过程
# jvm
# 类加载
# jvm之java类加载机制和类加载器(ClassLoader)的用法
# JVM类加载机制原理及用法解析
# 深入理解JVM之类加载机制详解
# 一文读懂Jvm类加载机制
# JVM的类加载过程以及双亲委派模型详解
# JVM核心教程之JVM运行与类加载全过程详解
# 详解JVM类加载机制及类缓存问题的处理方法
# jvm类加载器基础解析
# 浅谈JVM核心之JVM运行和类加载
# JVM类加载机制详解
# 从JVM分析Java的类的加载和卸载机制
# 通俗讲解JVM的类加载机制
# 加载
# 绑定
# 在这个
# 数据结构
# 转化为
# 区中
# 自己的
# 而不是
# 堆中
# 这是
# 就会
# 是在
# 地说
# 将会
# 子类
# 将在
# 句柄
# 这就是
# 则是
# 而在
相关文章:
如何破解联通资金短缺导致的基站建设难题?
css网站制作参考文献有哪些,易聊怎么注册?
娃派WAP自助建站:免费模板+移动优化,快速打造专业网站
弹幕视频网站制作教程下载,弹幕视频网站是什么意思?
建站之星安装提示数据库无法连接如何解决?
常州企业网站制作公司,全国继续教育网怎么登录?
如何设置并定期更换建站之星安全管理员密码?
江苏网站制作公司有哪些,江苏书法考级官方网站?
,有什么在线背英语单词效率比较高的网站?
在线教育网站制作平台,山西立德教育官网?
武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?
如何在阿里云ECS服务器部署织梦CMS网站?
香港服务器建站指南:免备案优势与SEO优化技巧全解析
建站主机功能解析:服务器选择与快速搭建指南
做企业网站制作流程,企业网站制作基本流程有哪些?
如何在橙子建站中快速调整背景颜色?
云南网站制作公司有哪些,云南最好的招聘网站是哪个?
合肥做个网站多少钱,合肥本地有没有比较靠谱的交友平台?
如何在云主机上快速搭建多站点网站?
小自动建站系统:AI智能生成+拖拽模板,多端适配一键搭建
如何续费美橙建站之星域名及服务?
如何设计高效校园网站?
网站制作费用多少钱,一个网站的运营,需要哪些费用?
c++23 std::expected怎么用 c++优雅处理函数错误返回【详解】
建站之星备案是否影响网站上线时间?
Thinkphp 中 distinct 的用法解析
东莞专业制作网站的公司,东莞大学生网的网址是什么?
如何通过网站建站时间优化SEO与用户体验?
C#怎么使用委托和事件 C# delegate与event编程方法
焦点电影公司作品,电影焦点结局是什么?
制作宣传网站的软件,小红书可以宣传网站吗?
linux top下的 minerd 木马清除方法
公众号网站制作网页,微信公众号怎么制作?
小型网站建站如何选择虚拟主机?
安徽网站建设与外贸建站服务专业定制方案
建站之星如何保障用户数据免受黑客入侵?
制作营销网站公司,淘特是干什么用的?
微信推文制作网站有哪些,怎么做微信推文,急?
网站专业制作公司有哪些,做一个公司网站要多少钱?
实例解析angularjs的filter过滤器
广州顶尖建站服务:企业官网建设与SEO优化一体化方案
教学网站制作软件,学习*后期制作的网站有哪些?
网站制作网站,深圳做网站哪家比较好?
油猴 教程,油猴搜脚本为什么会网页无法显示?
建站之星导航菜单设置与功能模块配置全攻略
网站建设制作需要多少钱费用,自己做一个网站要多少钱,模板一般多少钱?
专业网站建设制作报价,网页设计制作要考什么证?
制作网站外包平台,自动化接单网站有哪些?
如何在Golang中处理模块冲突_解决依赖版本不兼容问题
武汉外贸网站制作公司,现在武汉外贸前景怎么样啊?
*请认真填写需求信息,我们会在24小时内与您取得联系。