1. 什么是JVM
VM是JavaVirtualMachine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。它可以实现跨操作系统运行,即一处编译到处运行。下图是JVM的运行过程
2. 类加载过程
类加载的过程分为 7 个阶段:加载、验证、准备、解析、初始化、使用、卸载。
2.1 加载
所谓加载,简而言之就是将 Java 类的字节码文件加载到机器内存中,并在内存中构建出 Java 类的原型——类模板对象
2.2 验证
验证是连接阶段的第一步,目的是保证加载的字节码是合法的。
验证阶段包含 4 个动作:文件格式验证、元数据验证、字节码验证和符号引用验证。
2.3 准备
准备是连接阶段的第二步,目的是为静态变量(被 static 修饰的变量)分配内存,初始化默认值。
2.4 解析
解析是连接阶段的第三步,目的是将接口、变量、方法的符号引用转换为直接引用。
2.5 初始化
初始化是类加载过程的最后一个步骤,就是执行类构造器 <clinit>() 方法的过程。在此阶段,JVM 会执行执行类中编写的Java程序代码,对类的静态变量,静态代码块执行初始化操作。
2.6 使用
顾名思义,就是类的使用,例如使用new关键字实例化类
2.7 卸载
即在内存中销毁类
3. 类加载器
3.1 类加载器分类
-
启动类加载器:jvm启动的时候,会优先加载jre\lib这个目录的核心类库。
-
扩展类加载器:负责加载jre\lib\ext这个目录的类。
-
应用程序类加载器:负责加载我们写的代码。
-
自定义类加载器:根据我们的需要,加载特定的类。
3.2 双亲委托机制
所谓双亲委托,即加载器收到类加载请求时,先会委托给自己的父类处理,如果父类还有父类则会继续向上委托直到委托到启动类加载器处理,如果启动类加载也处理不了,则就会向下交给子类加载器自己处理,如果子类加载器自己也处理就继续交给下级子类加载器处理,直到加载该类类加载器处理