java类加载的全过程
来源:互联网 发布:nba新浪数据 编辑:程序博客网 时间:2024/05/21 06:59
java类进行加载的全过程主要有五个方面:加载->验证->准备->解析->初始化
一、加载
1.通过此类的全名来获取此类的二进制字节流。
2.将此字节流所代表的静态储存结构转化为方法区运行时数据结构。
3.在堆中创建一个java.long.class对象作为方法区数据的入口。
//这个过程,数据的来源是不一定的,可能来源于网络或者class、zip等,java没有对这个地方进行限定,所以可以插入很多技术,类的加载器可以自己写也可以用系统的,可以自己定义记载怎样的字节流。
二、校验
检验的步骤为:文件格式验证、元数据验证、字节码验证、符号引用验证
文件格式验证:验证字节流是否符合Class文件格式的规范并 验证其版本是否能被当前的jvm版本所处理。ok没问题后,字节流就可以进入内存的方法区进行保存了。后面的3个校验都是在方法区进行的。
元数据验证:对字节码描述的信息进行语义化分析,保证其描述的内容符合java语言的语法规范。
字节码检验:最复杂,对方法体的内容进行检验,保证其在运行时不会作出什么出格的事来。
符号引用验证:来验证一些引用的真实性与可行性,比如代码里面引了其他类,这里就要去检测一下那些来究竟是否存在;或者说代码中访问了其他类的一些属性,这里就对那些属性的可以访问行进行了检验。(这一步将为后面的解析工作打下基础)。
//验证的作用主要是为了保证录入的字节流符合jvm的口味,为了防止其崩溃。
三、准备
这个阶段主要是为类变量(静态变量)在方法区中分配内存,并进行初始化值。
//要注意的是这个时候静态变量并没有赋值,只是进行了默认初始化赋值,因为java代码还没有执行,这个被赋值的过程是在java编译时期被clinit存储的。但是如果该变量被final关键值修饰,编译时期,会给该变量一个constanvalue属性,这个变量在这个时候就会被赋值。
//前面一、二、三过程除了程序员可以自定义加载器外,其余都是jvm主导的
四、解析
暂时还不知道
五、初始化
这个阶段主要执行的clinit操作,对变量进行初始化
- java类加载的全过程
- java类加载全过程
- java类加载全过程
- Java类加载全过程
- java类加载全过程
- java类加载全过程
- java类加载全过程
- Java类加载全过程
- 分析Java类加载全过程
- 分析Java类加载全过程
- 【转】 Java类加载全过程
- java 编译和加载和执行类的全过程
- java中类加载的全过程及内存图分析
- java中类加载的全过程及内存图分析
- java中类加载的全过程及内存图分析
- Java面试相关:Java类加载全过程
- Java面试相关-- Java类加载全过程
- JAVA学习34_java类加载全过程
- 数组和链表的简介
- HDU4609——3-idiots(FFT求卷积,留着以后学)
- GP学习(九)—Working with geodatabases and the geoprocessor
- 【php】面向对象
- 一起做slam中遇到的问题"
- java类加载的全过程
- 【杭电oj】3625 - Examining the Rooms(第一类斯特林数打表)
- 获取spinner的默认选择项的value
- Unity重新编译mono实现热更新
- #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
- 使用JSON实现简单的城市级联查询
- RecyclerView实现条目Item拖拽排序与滑动删除
- 【DM】设计模式再回顾---策略模式
- 读写Porperties文件