甜野猫|清华大佬力荐的JVM学习路线+实战笔记+阿里真题,吃透吊打面试官

JVM知识点梳理JVM是Java Virtual Machine(Java虚拟机)的缩写 , JVM是一种用于计算设备的规范 , 它是一个虚构出来的计算机 , 是通过在实际的计算机上仿真模拟各种计算机功能来实现的 。 Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域 。JVM屏蔽了与具体操作系统平台相关的信息 , 使Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行 。 JVM在执行字节码时 , 实际上最终还是把字节码解释成具体平台上的机器指令执行 。
JVM 组成部分
甜野猫|清华大佬力荐的JVM学习路线+实战笔记+阿里真题,吃透吊打面试官如上面的架构图所示 , JVM分为三个主要子系统:

  1. Class Loader子系统
  2. 运行时数据区
  3. 执行引擎
ClassLoader子系统Java的动态类加载功能由ClassLoader子系统处理 。 它加载 , 链接 。 并在运行时(而非编译时)首次引用类似初始化类文件 。
加载
类将由此组件加载 。 BootStrap ClassLoader , 扩展ClassLoader和Application ClassLoader是有助于实现该目标的三个ClassLoader 。
  1. BootStrap ClassLoader :负责从引导类路径中加载类 , 仅用于rt.jar 。 最高优先级将给予此加载程序 。
  2. 扩展ClassLoader :负责加载ext文件夹(jre \ lib)内的类 。
  3. Application ClassLoader :负责加载应用程序级别的类路径 , 提到的环境变量路径等 。
连结
  1. 验证:字节码验证程序将验证生成的字节码是否正确 , 如果验证失败 , 我们将收到验证错误 。
  2. 准备:将为所有静态变量分配内存并为其分配默认值 。
  3. 解决:将所有符号内存引用替换为“方法区域”中的原始引用 。
初始化
【甜野猫|清华大佬力荐的JVM学习路线+实战笔记+阿里真题,吃透吊打面试官】这是ClassLoading的最后阶段;在此 , 所有静态变量将被分配原始值 , 并且将执行静态块 。
运行时数据区运行时数据区分为五个主要部分:
1、方法区域 :所有类级别的数据(包括静态变量)都将存储在此处 。 每个JVM只有一个方法区域 , 它是共享资源 。
2、堆区 :所有对象及其对应的实例变量和数组将存储在此处 。 每个JVM还有一个堆区 。 由于“方法”和“堆”区域共享多个线程的内存 , 因此存储的数据不是线程安全的 。
3、堆栈区 :对于每个线程 , 将创建一个单独的运行时堆栈 。 对于每个方法调用 , 将在堆栈存储器中创建一个条目 , 称为堆栈帧 。 所有局部变量都将在堆栈存储器中创建 。 堆栈区域不是共享资源 , 因此是线程安全的 。 堆栈框架分为三个子实体:
  • 局部变量数组——与该方法有关 , 涉及多少局部变量 , 并且相应的值将存储在此处 。
  • 操作数堆栈——如果需要执行任何中间操作 , 则操作数堆栈充当执行该操作的运行时工作区 。
  • 帧数据——与该方法相对应的所有符号都存储在此处 。 在任何例外情况下 , 捕获块信息将保留在帧数据中 。
4、PC寄存器 :每个线程将具有单独的PC寄存器 , 以在执行指令后保存当前执行指令的地址 , PC寄存器将用下一条指令进行更新 。
5、本机方法堆栈 :本机方法堆栈保存本机方法信息 。 对于每个线程 , 将创建一个单独的本机方法堆栈 。
执行引擎分配给运行时数据区的字节码将由执行引擎执行 。 执行引擎读取字节码并逐段执行 。
1、解释器:解释器解释字节码的速度较快 , 但执行速度较慢 。 解释器的缺点是 , 当多次调用一种方法时 , 每次都需要新的解释 。


推荐阅读