JVM类加载机制详解(5大加载步骤图解)

JVM类加载机制详解(5大加载步骤图解)-mikechen

JVM类加载机制经常在Java面试被问到,比如:JVM类加载机制过程等,下面我重点详解JVM类加载机制@mikechen

JVM类加载机制

JVM的类加载机制是指:JVM将字节码文件加载到内存中的过程,整个过程如下图所示:

JVM类加载机制详解(5大加载步骤图解)-mikechen

JVM类加载机制过程主要会包含:加载、验证、准备、解析、和初始化的过程,下面我一一来详解@mikechen

 

加载

加载是指将类的字节码文件从文件系统或网络中读取到内存中,并在内存中创建一个java.lang.Class对象来代表这个类。

如下图所示:

JVM类加载机制详解(5大加载步骤图解)-mikechen

在加载阶段中,JVM会执行以下操作:

1.通过类加载器查找并加载类的字节码数据

当JVM需要使用某个类时,会首先通过类加载器查找该类的字节码数据,这些字节码数据可以来自于文件、网络、数据库等各种来源。

2.将类的字节码数据转化为JVM内部数据结构,并存储在方法区中

在获取类的字节码数据后,JVM会将其转化为JVM内部数据结构,包括常量池、字段表、方法表等等,并将其存储在方法区中。

3.为类的静态变量分配内存,并设置默认初始值

在加载阶段中,JVM会为类的静态变量分配内存,并设置默认初始值,这些静态变量包括基本类型和引用类型。

4.生成代表该类的Class对象,并存储在方法区中

在加载阶段完成后,JVM会生成一个代表该类的Class对象,并将其存储在方法区中。

Class对象包含了该类的所有信息,例如类名、父类名、接口名、字段名、方法名等等。

 

验证

验证主要就是:确保加载的类符合JVM规范,不会危害JVM的安全。

如下图所示:

JVM类加载机制详解(5大加载步骤图解)-mikechen

验证主要分为3个步骤:

1.文件格式验证 

在这个阶段,JVM会验证Class文件的格式是否符合规范。

例如:JVM会检查文件头是否正确,常量池是否包含了必要的信息,方法中是否有不允许的指令等等。

2.语义验证 在这个阶段

JVM会对字节码进行语义分析,确保代码中不会存在语法错误和语义错误。

例如:JVM会检查是否有非法的类型转换、是否有访问不允许访问的方法等等。

3.字节码验证 在这个阶段

JVM会对字节码进行验证,以确保它不会对JVM的安全性产生威胁。

例如:JVM会检查是否有越界访问数组、是否有使用了不安全的指针等等。

 

准备

在准备阶段,JVM会为类的静态变量分配内存,并设置默认初始值,这些静态变量包括基本类型和引用类型。

JVM为静态变量分配的内存会在堆中,而非在栈中,如下图所示:

JVM类加载机制详解(5大加载步骤图解)-mikechen

JVM会将类的所有静态变量设置为默认初始值,这些默认值包括:

  • 对于基本类型,例如int、float等等,初始值是0或0.0。
  • 对于布尔类型,初始值是false。
  • 对于char类型,初始值是空字符。
  • 对于引用类型,初始值是null。

 

解析

解析阶段的主要任务是将类或接口中的符号引用转化为直接引用,如下图所示:

JVM类加载机制详解(5大加载步骤图解)-mikechen

在解析阶段中,JVM会完成以下三个任务:

1.将类或接口中的常量池中的符号引用替换为直接引用

在Java中类和接口中的常量池存储了许多符号引用,包括:类名、字段名、方法名等等。

在解析阶段中,JVM会将这些符号引用替换为直接引用,从而使得类或接口中的各个元素能够被正确引用。

2.解析类或接口中的父类和接口的符号引用

在解析阶段中,JVM会将类或接口中的父类和父接口的符号引用解析成直接引用,从而构建类或接口之间的继承和实现关系。

3.将字段和方法的符号引用解析成直接引用

在解析阶段中,JVM会将这些符号引用解析成直接引用,从而使得程序能够正确地访问和调用字段和方法。

 

初始化

初始化阶段是类加载的最后一个阶段,也是最重要的阶段之一。

在初始化阶段,JVM会为类的静态变量赋初值,并执行类的静态代码块。

如下图所示:

JVM类加载机制详解(5大加载步骤图解)-mikechen

在初始化阶段中,JVM会执行以下操作:

1.为类的静态变量分配内存,并设置初始值

在加载阶段中,JVM会为类的静态变量分配内存,并设置默认初始值。

2.执行类的静态代码块

在初始化阶段中,JVM会执行类的静态代码块,这些静态代码块中可以包含任意的Java代码。

以上就是JVM类加载机制详解,更多JVM请查看:JVM(Java虚拟机)从0到1全部合集

陈睿mikechen

10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注「mikechen」公众号,获取更多技术干货!

后台回复面试即可获取《史上最全阿里Java面试题总结》,后台回复架构,即可获取《阿里架构师进阶专题全部合集

评论交流
    说说你的看法