JVM类加载机制经常在Java面试被问到,比如:JVM类加载机制过程等,下面我重点详解JVM类加载机制@mikechen
JVM类加载机制
JVM的类加载机制是指:JVM将字节码文件加载到内存中的过程,整个过程如下图所示:
JVM类加载机制过程主要会包含:加载、验证、准备、解析、和初始化的过程,下面我一一来详解@mikechen
加载
加载是指将类的字节码文件从文件系统或网络中读取到内存中,并在内存中创建一个java.lang.Class对象来代表这个类。
如下图所示:
在加载阶段中,JVM会执行以下操作:
1.通过类加载器查找并加载类的字节码数据
当JVM需要使用某个类时,会首先通过类加载器查找该类的字节码数据,这些字节码数据可以来自于文件、网络、数据库等各种来源。
2.将类的字节码数据转化为JVM内部数据结构,并存储在方法区中
在获取类的字节码数据后,JVM会将其转化为JVM内部数据结构,包括常量池、字段表、方法表等等,并将其存储在方法区中。
3.为类的静态变量分配内存,并设置默认初始值
在加载阶段中,JVM会为类的静态变量分配内存,并设置默认初始值,这些静态变量包括基本类型和引用类型。
4.生成代表该类的Class对象,并存储在方法区中
在加载阶段完成后,JVM会生成一个代表该类的Class对象,并将其存储在方法区中。
Class对象包含了该类的所有信息,例如类名、父类名、接口名、字段名、方法名等等。
验证
验证主要就是:确保加载的类符合JVM规范,不会危害JVM的安全。
如下图所示:
验证主要分为3个步骤:
1.文件格式验证
在这个阶段,JVM会验证Class文件的格式是否符合规范。
例如:JVM会检查文件头是否正确,常量池是否包含了必要的信息,方法中是否有不允许的指令等等。
2.语义验证 在这个阶段
JVM会对字节码进行语义分析,确保代码中不会存在语法错误和语义错误。
例如:JVM会检查是否有非法的类型转换、是否有访问不允许访问的方法等等。
3.字节码验证 在这个阶段
JVM会对字节码进行验证,以确保它不会对JVM的安全性产生威胁。
例如:JVM会检查是否有越界访问数组、是否有使用了不安全的指针等等。
准备
在准备阶段,JVM会为类的静态变量分配内存,并设置默认初始值,这些静态变量包括基本类型和引用类型。
JVM为静态变量分配的内存会在堆中,而非在栈中,如下图所示:
JVM会将类的所有静态变量设置为默认初始值,这些默认值包括:
- 对于基本类型,例如int、float等等,初始值是0或0.0。
- 对于布尔类型,初始值是false。
- 对于char类型,初始值是空字符。
- 对于引用类型,初始值是null。
解析
解析阶段的主要任务是将类或接口中的符号引用转化为直接引用,如下图所示:
在解析阶段中,JVM会完成以下三个任务:
1.将类或接口中的常量池中的符号引用替换为直接引用
在Java中类和接口中的常量池存储了许多符号引用,包括:类名、字段名、方法名等等。
在解析阶段中,JVM会将这些符号引用替换为直接引用,从而使得类或接口中的各个元素能够被正确引用。
2.解析类或接口中的父类和接口的符号引用
在解析阶段中,JVM会将类或接口中的父类和父接口的符号引用解析成直接引用,从而构建类或接口之间的继承和实现关系。
3.将字段和方法的符号引用解析成直接引用
在解析阶段中,JVM会将这些符号引用解析成直接引用,从而使得程序能够正确地访问和调用字段和方法。
初始化
初始化阶段是类加载的最后一个阶段,也是最重要的阶段之一。
在初始化阶段,JVM会为类的静态变量赋初值,并执行类的静态代码块。
如下图所示:
在初始化阶段中,JVM会执行以下操作:
1.为类的静态变量分配内存,并设置初始值
在加载阶段中,JVM会为类的静态变量分配内存,并设置默认初始值。
2.执行类的静态代码块
在初始化阶段中,JVM会执行类的静态代码块,这些静态代码块中可以包含任意的Java代码。
以上就是JVM类加载机制详解,更多JVM请查看:JVM(Java虚拟机)从0到1全部合集
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》,后台回复【面试】即可获取《史上最全阿里Java面试题总结》