java虚拟机类加载的过程(加载,验证,准备,解析,初始化)

java虚拟机类加载的过程:

加载,验证,准备,解析,初始化

一.加载(此加载非彼加载)

1.通过一个类的全限定名来获取定义此类的二进制流。此处并没有指定二进制流从哪里获取,它可以从class文件中获取,也可以从网上获取,这也是类加载过程中可控性最大的一个部分。

2.将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。

3.在内存中生成一个代表这个类的java.lang.class对象,作为方法区这个类的各种数据的访问入口。

二.验证

1.这是连接阶段的第一步,这一阶段的目的是为了确保class文件的字节流包含的信息符合当前虚拟机的要求,并且不会危害到虚拟机的自身安全。

2.验证分为四个:文件格式验证,元数据验证,字节码验证,符号引用验证。

三. 准备

1.正式为类变量分配内存,包括static变量,但不包括实例变量。

2.设置类变量的初始值,这里所说的初始值是零值,比如 static int value=123;准备过后它的值是0,而不是123,123是在初始化的时候才会执行。

3.特殊情况:如果类字段的字段属性表存在constantvalue属性,那么准备阶段就会被初始化为constantvalue所指定的值。

四. 解析

1.虚拟机将常量池内的符号引用替换为直接引用的一个过程。

2.符号引用:以一组符号来描述所引用的目标,符号可以是任何形式的字面量,只要使用时能无歧义的定位到目标就可以了,但是它与虚拟机实现的内存布局无关。各种虚拟机实现的内存布局可以不相同,但是他们能够接受的符号引用必须一致,因为符号引用的字面量形式明确定义在java虚拟机的规范的class文件格式当中。

3.直接引用:直接引用直接可以指向目标的指针,相对偏移量或是一个能间接定位到目标的句柄,它与虚拟机的内存布局有关。

4.解析主要分为以下几种:类或接口的解析,字段的解析,类方法的解析,接口方法的解析。

五.初始化

到了初始化的阶段,才真正开始执行类中定义的java代码,换句话说就是字节码。

发布了415 篇原创文章 · 获赞 434 · 访问量 21万+

猜你喜欢

转载自blog.csdn.net/qq_41901915/article/details/103610734