没有合适的资源?快使用搜索试试~ 我知道了~
深入理解Java类加载.docx
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 29 浏览量
2022-06-27
22:06:02
上传
评论
收藏 626KB DOCX 举报
温馨提示
试读
14页
虚拟机把描述类的数据从 Class 文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的 Java 类型,这就是虚拟机的类加载机制。 在Java语言里面,类型的加载、连接和初始化过程都是在程序运行期间完成的 类加载的过程 类的个生命周期如下图:
资源推荐
资源详情
资源评论
深入理解 Java 类加载
本文目的:
1. 深入理解 Java 类加载机制;
2. 理解各个类加载器特别是线程上下文加载器;
Java 虚拟机类加载机制
虚拟机把描述类的数据从 Class 文件加载到内存,并对数据进行校验、转换解
析和初始化,最终形成可以被虚拟机直接使用的 Java 类型,这就是虚拟机的
类加载机制。
在 Java 语言里面,类型的加载、连接和初始化过程都是在程序运行期间完成的
类加载的过程
类的个生命周期如下图:
为支持运行时绑定,解析过程在某些情况下可在初始化之后再开始,除解析过
程外的其他加载过程必须按照如图顺序开始。
加载
1. 通过全限定类名来获取定义此类的二进制字节流。
2. 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。
3. 在内存中生成一个代表这个类的 java.lang.Class 对象,作为方法区这个类的各种
数据的访问入口。
验证
验证是连接阶段的第一步,这一阶段的目的是为了确保 Class 文件的字节流中
包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。
1.
文件格式验证:如是否以魔数 0xCAFEBABE 开头、主、次版本号是否
在当前虚拟机处理范围之内、常量合理性验证等。
此阶段保证输入的字节流能正确地解析并存储于方法区之内,格式上符
合描述一个 Java 类型信息的要求。
2.
3.
元数据验证:是否存在父类,父类的继承链是否正确,抽象类是否实现
了其父类或接口之中要求实现的所有方法,字段、方法是否与父类产生
矛盾等。
第二阶段,保证不存在不符合 Java 语言规范的元数据信息。
4.
5.
字节码验证:通过数据流和控制流分析,确定程序语义是合法的、符合
逻辑的。例如保证跳转指令不会跳转到方法体以外的字节码指令上。
6.
7. 符号引用验证:在解析阶段中发生,保证可以将符号引用转化为直接引用。
可以考虑使用-Xverify:none参数来关闭大部分的类验证措施,以缩短虚拟机
类加载的时间。
准备
为类变量分配内存并设置类变量初始值,这些变量所使用的内存都将在方法区
中进行分配。
解析
虚拟机将常量池内的符号引用替换为直接引用的过程。
解析动作主要针对类或接口、字段、类方法、接口方法、方法类型、方法句柄
和调用点限定符 7 类符号引用进行。
初始化
到初始化阶段,才真正开始执行类中定义的 Java 程序代码,此阶段是执
行<clinit>()方法的过程。
<clinit>()方法是由编译器按语句在源文件中出现的顺序,依次自动收集类中
的所有类变量的赋值动作和静态代码块中的语句合并产生的。(不包括构造器
中的语句。构造器是初始化对象的,类加载完成后,创建对象时候将调用的<i
nit>()方法来初始化对象)
静态语句块中只能访问到定义在静态语句块之前的变量,定义在它之后的变量,
在前面的静态语句块可以赋值,但是不能访问,如下程序:
public class Test {
static {
// 给变量赋值可以正常编译通过
i = 0;
// 这句编译器会提示"非法向前引用"
System.out.println(i);
}
static int i = 1;
}
<clinit>()不需要显式调用父类(接口除外,接口不需要调用父接口的初始化
方法,只有使用到父接口中的静态变量时才需要调用)的初始化方法<clinit>
(),虚拟机会保证在子类的<clinit>()方法执行之前,父类的<clinit>()
方法已经执行完毕,也就意味着父类中定义的静态语句块要优先于子类的变量
赋值操作。
<clinit>()方法对于类或接口来说并不是必需的,如果一个类中没有静态语句
块,也没有对变量的赋值操作,那么编译器可以不为这个类生成<clinit>()
方法。
虚拟机会保证一个类的<clinit>()方法在多线程环境中被正确地加锁、同步,
如果多个线程同时去初始化一个类,那么只会有一个线程去执行这个类的<cli
nit>()方法,其他线程都需要阻塞等待,直到活动线程执行<clinit>()方法
完毕。
剩余13页未读,继续阅读
资源评论
小兔子平安
- 粉丝: 209
- 资源: 1940
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功