十、类加载过程
来源:互联网 发布:java编程思想4 pdf 编辑:程序博客网 时间:2024/06/11 22:27
类加载的过程分为加载、连接(验证、准备、解析)和初始化三个步骤。
1、加载
在加载阶段,虚拟机需要完成以下事情:
①通过一个类的权限定名来获取和定义此类的二进制字节流
②将二进制字节流的静态存储结构转换为方法区的运行时数据结构
③在Java堆中生成一个代表该类的Class对象,作为方法区数据的访问入口。
2、连接
⑴验证
目的:为了确保Class文件的字节流中包含的信息符合虚拟机的要求,并且不会危害到虚拟机自身的安全。
①文件格式验证:验证字节流是否符合Class文件格式的规范,并且能够被当前虚拟机进行处理。
②元数据验证:对字节码描述的信息进行语义分析,以保证其描述的信息符合Java语言规范的要求。
③字节码验证:主要工作是进行数据流和控制流分析。这个阶段将对类的方法进行校验分析,确保运行时不会危害到虚拟机的安全。
④符号引用验证:这个验证发生在解析阶段,它的目的是确保解析动作能正常执行。
⑵准备
为类的静态变量分配内存并设置默认初始值。
⑶解析
将虚拟机常量池中符号引用替换为直接引用。解析动作主要针对类或接口、字段、类方法、接口方法四类符号引用进行,分别对应常量池的CONSTANT_Class_info、CONSTANT_Fieldref_info、CONSTANT_Methodref_info及CONSTANT_InterfaceMetodref_info四种常量类型。
符号引用:以一组符号来描述所引用的目标,符号引用可以是任何形式的字面量,只要能唯一确定目标即可。
直接引用:可以是直接指向目标的指针、相对位移量或是一个能间接定位到目标的句柄。符号引用与虚拟机的内存布局无关,引用的目标并不一定已经加载到内存中。直接引用与虚拟机的内存布局相关,同一符号引用在不同的虚拟机上翻译的直接引用一般不会相同。如果有了直接引用,那引用的目标必定已经在内存中存在。
3、初始化
类的初始化阶段是类加载过程的最后一步,前面的加载过程中,除了在加载阶段用户应用程序可以通过自定义类加载器参与之外,其余都由虚拟机主导和控制,到了初始化阶段,才真正开始执行类中定义的Java程序代码。
初始化的顺序:若初始化类的父类还没有初始化,那么先对其父类进行初始化。若初始化类定义了初始化代码,那么按代码顺序执行初始化。
- 十、类加载过程
- 类的加载过程,不求甚解即可(十)
- Understanding the JVM(十)虚拟机类加载的过程
- 类加载过程---加载
- 二十、类加载实例
- jvm类加载过程
- 类的加载过程
- 类加载过程分析
- JVM 类加载过程
- java类加载过程
- java类加载过程
- 虚拟机类加载过程
- Java类加载过程
- java类加载过程
- 类加载过程
- 类的加载过程
- JVM 类加载过程
- Java类加载过程
- spring+quartz实现定时任务
- JQuery简介
- 非阻塞式connect的Windows实现
- mysql忘记root密码怎么办?重设Mysql密码的方法
- lamp服务器个人理解
- 十、类加载过程
- Lua实现游戏震屏效果
- mapduce中自定义分组
- 异常解决 java.io.FileNotFoundException: class path resource [spring/springmvc.xml]
- 第三十二讲项目1-输出星号(1)
- java 父类引用指向子类对象---动态绑定之易错点详解
- 为程序界面添加滑动条
- ScrollView嵌套WebView冲突解决方法
- vs2013如何快速批量注释