1、什么是jvm的类加载机制
类加载机制是指我们将类的字节码文件所包含的数据读入内存,同时我们会生成数据的访问入口的一种 特殊机制。那么我们可以得知,类加载的最终产品是数据访问入口。
- 从本地系统中直接加载。
- 通过网络下载的.class文件。比如Web Applet,也就是我们的小程序应用。
- 从war,jar等归档文件中加载class。
- 从专有数据库中提取.class文件。
- 将java源文件动态编译为.class文件,也就是运行时计算而成,java的动态代理技术就是这么实现的。
- 从加密文件中获取。典型的防止class文件被反编译的保护措施。
2、类装载的过程
类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个过程包括:装载、验证、准备、解析、初始化、使用、卸载7个阶段。其中验证、准备、解析统称为链接。如下图
- 装载(Loading):
获取类的二进制字节流的阶段是我们java程序员最关注的阶段,也是操作性最强的一个阶段,因为这个阶段我们可以对我们的类加载器进行操作 ,比如我们想自定义类加载器进行操作完成加载,又或者我们想通过java agent来完成我们的字节码增强操作。
- 连接(Linking):
- 验证(Verification):验证主要是为了保证被加载类的正确性,即装载的Class文件中的字节流保护的信息是否符合当前虚拟机的要求,并且还要求我们的信息不会危害虚拟机自身的安全,导致虚拟机的崩溃。这其中包括四个阶段:
- 文件格式的验证:第一阶段要验证字节流是否符合class文件格式的规范,并且能被当前版本的虚拟机处理
- 元数据的验证:第二阶段是对字节码描述的信息进行语义分析,以保证其描述的信息符合Java语言规范的要求。
- 字节码验证:第三阶段是整个验证过程中最复杂的一个阶段,主要目的是通过数据流和控制流分析,确定程序语义是合法的、符合逻辑的。在第二阶段对元数据信息中的数据做完校验后,这个阶段将对类对方法体进行校验分析,保证被校验类对方法在运行时不会做出危害虚拟机安全对事件。
- 符号引用验证:这是最后一个阶段的验证,它发生在虚拟机将符号引用转化为直接引用的时候(解析阶段), 可以看作是对类自身以外的信息(常量池中的各种符号引用)进行匹配性的校验。符号引用 验证的目的是确保解析动作能正常执行。
- 准备(Preparation):为类的静态变量分配内存,并将其初始化为默认值。
- 解析(Resolution):
- 验证(Verification):验证主要是为了保证被加载类的正确性,即装载的Class文件中的字节流保护的信息是否符合当前虚拟机的要求,并且还要求我们的信息不会危害虚拟机自身的安全,导致虚拟机的崩溃。这其中包括四个阶段:
- 初始化(Initialization):对类的静态变量,静态代码块执行初始化操作
- 使用(Useing):
- 卸载(Unloading):
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。