没有合适的资源?快使用搜索试试~ 我知道了~
jvm系列一java类的加载机制.doc
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 164 浏览量
2021-10-12
07:57:25
上传
评论
收藏 141KB DOC 举报
温馨提示
试读
13页
jvm系列一java类的加载机制.doc
资源推荐
资源详情
资源评论
.. -
jvm
系列
(
一
):java
类的加载机制
类加载机制的微妙。
1、什么是类的加载
类的加载指的是将类的 文件中的二进制数据读入到存中,将其放在运行时数据
区的法区,然后在堆区创立一个 对象,用来封装类在法区的数据构造。
类的加载的最终产品是位于堆区中的 对象, 对象封装了类在法区的数据构
造,并且向 程序员提供了访问法区的数据构造的接口。
类加载器并不需要等到某个类被“首次主动使用〞时再加载它, 规允类加载器在预
料某个类将要被使用时就预先加载它,如果在预先加载的过程中遇到了 文件缺
失或存在错误,类加载器必须在程序首次主动使用该类时才报告错误〔
错误〕如果这个类一直没有被程序主动使用,那么类加载器就不会报告错误
加载.class 文件的式
从本地系统中直接加载
通过网络下载 文件
从 , 等归档文件中加载 文件
从专有数据库中提取 文件
将 源文件动态编译为 文件
2、类的生命期
. . word.zl-
.. -
其中类加载的过程包括了加载、验证、准备、解析、初始化五个阶段。在这五个阶段
中,加载、验证、准备和初始化这四个阶段发生的顺序是确定的,而解析阶段那么不
一定,它在某些情况下可以在初始化阶段之后开场,这是为了支持 语言的运行时
绑定〔也成为动态绑定或晚期绑定〕。另外注意这里的几个阶段是按顺序开场,而不
是按顺序进展或完成,因为这些阶段通常都是互相穿插地混合进展的,通常在一个阶
段执行的过程中调用或激活另一个阶段。
加载
查找并加载类的二进制数据加载时类加载过程的第一个阶段,在加载阶段,虚拟机需
要完成以下三件事情:
通过一个类的全限定名来获取其定义的二进制字节流。
将这个字节流所代表的静态存储构造转化为法区的运行时数据构造。
在 堆中生成一个代表这个类的 对象,作为对法区中这些
数据的访问入口。
相对于类加载的其他阶段而言,加载阶段〔准确地说,是加载阶段获取类的二进制字
节流的动作〕是可控性最强的阶段,因为开发人员既可以使用系统提供的类加载器来
完成加载,也可以自定义自己的类加载器来完成加载。
加载阶段完成后,虚拟机外部的二进制字节流就按照虚拟机所需的格式存储在法区之
中,而且在 堆中也创立一个 类的对象,这样便可以通过该对象访
问法区中的这些数据。
连接
验证:确保被加载的类的正确性
. . word.zl-
.. -
验证是连接阶段的第一步,这一阶段的目的是为了确保 文件的字节流中包含的
信息符合当前虚拟机的要求,并且不会危害虚拟机自身的平安。验证阶段大致会完成
个阶段的检验动作:
文件格式验证:验证字节流是否符合 文件格式的规;例如:是否以
!! 开头、主次版本号是否在当前虚拟机的处理围之、常量池中的常
量是否有不被支持的类型。
元数据验证:对字节码描述的信息进展语义分析〔注意:比照 编译阶段
的语义分析〕,以保证其描述的信息符合 语言规的要求;例如:这个类
是否有父类,除了 "# 之外。
字节码验证:通过数据流和控制流分析,确定程序语义是合法的、符合逻辑的。
符号引用验证:确保解析动作能正确执行。
验证阶段是非常重要的,但不是必须的,它对程序运行期没有影响,如果所引用的类
经过反复验证,那么可以考虑采用$%&' 参数来关闭大局部的类验证措施,以
缩短虚拟机类加载的时间。
准备:为类的静态变量分配存,并将其初始化为默认值
准备阶段是正式为类变量分配存并设置类变量初始值的阶段,这些存都将在法区中分
配。对于该阶段有以下几点需要注意:
(、这时候进展存分配的仅包括类变量〔〕,而不包括实例变量,实例变
量会在对象实例化时随着对象一块分配在 堆中。
) 、 这 里 所 设 置 的 初 始 值 通 常 情 况 下 是 数 据 类 型 默 认 的 零 值 〔 如
、、*、& 等〕,而不是被在 代码中被显式地赋予的值。
假设一个类变量的定义为:*#+++*+,+-;
那么变量 * 在准备阶段过后的初始值为 ,而不是 -,因为这时候尚未开场执行
任 法,而把 * 赋值为 - 的 *#+ 指令是在程序编译后,存放于类构造
器./〔〕法之中的,所以把 * 赋值为 - 的动作将在初始化阶段才会执行。
这里还需要注意如下几点:E
$+对根本数据类型来说,对于类变量〔〕和全局变量,如果不显
式地对其赋值而直接使用,那么系统会为其赋予默认的零值,而对于局
部变量来说,在使用前必须显式地为其赋值,否那么编译时不通过。E
$+对于同时被 和 0 修饰的常量,必须在声明的时候就为其显
式地赋值,否那么编译时不通过;而只被 0 修饰的常量那么既可以
在声明时显式地为其赋值,也可以在类初始化时显式地为其赋值,总之,
在使用前必须为其显式地赋值,系统不会为其赋予默认零值。E
$+对于引用数据类型 & 来说,如数组引用、对象引用等,如果
没有对其进展显式地赋值而直接使用,系统都会为其赋予默认的零值,
即 *。E
. . word.zl-
剩余12页未读,继续阅读
资源评论
wsbhm62
- 粉丝: 7
- 资源: 22万+
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功