JVM - 类加载机制

总结

 

1. 加载阶段  (Loading)

简单描述:

在Java程序运行之前JVM会把编译完成的.class二进制文件加载到内存,后续提供程序使用,这里用到的就是类加载器ClassLoader(JVM - 双亲委派机制 Parent-Delegation Model)。

详细描述:

虚拟机需要完成以下3件事情:
1)通过一个类的全限定名来获取定义此类的二进制字节流。
2)将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。
3)在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口。

 

2. 验证阶段(Verification)

验证是连接的第一步,目的是为了确保Class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危及虚拟机本身的安全。 验证阶段的四个步骤:文件格式检验、元数据检验、字节码检验、符号引用检验。

 

3. 准备阶段(Preparation)

正式为类变量分配内存并设置类变量初始值(零值)的阶段,这些变量所使用的内存都将在 (jdk1.7 方法区) (jdk1.8 Metaspace)中进行分配。
这个阶段中进行内存分配的仅包括类变量(被static修饰的变量),而不包括实例变量,实例变量将会在对象实例化时随着对象一起分配在Java堆中。

其次,这里所说的初始值“通常情况”下是数据类型的零值,假设一个类变量的定义为:
public static int value=123;
那变量value在准备阶段过后的初始值为0而不是123,因为这时候尚未开始执行任何Java方法

 

4. 解析阶段(Resolution)

是虚拟机将常量池内的符号引用替换为直接引用的过程

 

5. 类初始化阶段 (Initialization)

这是类加载的最后一步,真正执行类中定义的字节码,也就是.class文件。 初始化阶段是执行类构造器方法的过程,以及真正初始化类变量和其他资源的过程。

类的静态变量静态代码块执行初始化操作.

之前 public static int value=123;这句话,在准备阶段只是赋了零值。在这一步会赋予123的值。

 

posted on 2020-12-15 00:36  frank_cui  阅读(50)  评论(0编辑  收藏  举报

导航

levels of contents