大数据知识体系
首页
数据结构与算法
  • JVM
  • Java
  • Scala
  • Python
设计模式
  • MySQL
  • Redis
  • HDFS
  • HBase
  • ClickHouse
  • ElasticSearch
  • Iceberg
  • Hudi
  • Spark
  • Flink
  • Hive
  • Yarn
  • Zookeeper
  • Maven
  • Git
  • 数据仓库
  • 用户画像
  • 指标体系
数据治理
关于
首页
数据结构与算法
  • JVM
  • Java
  • Scala
  • Python
设计模式
  • MySQL
  • Redis
  • HDFS
  • HBase
  • ClickHouse
  • ElasticSearch
  • Iceberg
  • Hudi
  • Spark
  • Flink
  • Hive
  • Yarn
  • Zookeeper
  • Maven
  • Git
  • 数据仓库
  • 用户画像
  • 指标体系
数据治理
关于
  • JVM

    • JVM 架构
      • 一、JVM 简述
      • 二、JVM 架构概览
        • 2.1 类加载器子系统
        • 2.1.1 类加载器分类
        • 2.1.2 双亲委派机制
        • 2.2 运行时数据区
        • 2.3 执行引擎
        • 2.3.1 解释器
        • 2.3.2 即时编译器
        • 2.3.3 垃圾回收器
      • 参考资料
    • JVM 类加载机制
    • JVM 运行时数据区
    • JVM 垃圾回收机制
    • JVM 性能监控与调优
    • JVM 常见错误
  • Java

    • Java基础

      • Java 基础知识
      • Java 基础 - 枚举类
      • Java 基础 - 异常处理
      • Java 基础 - 泛型
      • Java 基础 - 反射
      • Java 基础 - 代理模式
      • Java 基础 - 注解
    • Java集合

    • Java并发编程

    • Java 开发规范
  • Scala

    • Scala 概述
  • Python

    • Numpy

      • 初识 Numpy
      • ndarray 的创建方式
      • NumPy 的数据类型
      • NumPy 数组计算
      • 拷贝
      • 索引和切片
      • 数学和统计方法
      • 数组形状变换
      • 通用函数
      • 排序
      • 搜索和计数
      • 线性代数
      • 伪随机数生成
      • 广播
      • 文件输入和输出
    • Pandas

      • 初识 Pandas
      • 认识 Series 和 DataFrame
      • Series 和 DataFrame 增删改查
      • Index对象增删改查
      • 普通列和行Index相互转化
      • 快速查看整体信息
      • 数值运算
      • 合并数据集
      • 数值统计与聚合
      • 分组聚合
      • 分类类型
      • 排序和排名
      • 时间序列
      • 文件输入与输出
      • 缺失值处理
      • 字符串处理
      • pandas sql
      • 其它
  • 语言基础
  • JVM
Will
2022-08-10
目录

JVM 架构

# 一、JVM 简述

JVM 即 Java Virtual Machine,Java 虚拟机运行在操作系统之上,是一台执行 Java 字节码的虚拟计算机,拥有独立的运行机制。它的作用就是运行二进制字节码(装载字节码并解释为对应操作系统的机器指令),其运行的 Java 字节码也未必是 Java 语言编译产生的。

另外,从下图可以看出,JVM 和硬件没有直接交互。

自从 1996 年初 Sun 发布的 JDK1.0 中包含的 Sun Classic 虚拟机到今天,曾出现过许许多多的虚拟机版本,它们各有特色、万家争鸣。包括但不限于:

  • Sun Classic/Exact VM
  • HotSpot VM
  • Mobile/Embedded VM
  • BEA JRockit/IBM J9 VM
  • BEA Liquid VM/Azul VM
  • Apache Harmony/Google Android Dalvik VM
  • Microsoft JVM
  • KVM
  • JCVM
  • Squawk VM
  • JavaInJava
  • Maxine VM
  • Jikes RVM
  • IKVM.NET

在众多虚拟机版本中,HotSpot VM 目前是使用范围最广的,它是 Sun/Oracle JDK 和 Open JDK 中默认的 Java 虚拟机。

# 二、JVM 架构概览

如上图所示,JVM 总共包含三个子系统:

  • 类加载子系统(Class Loader SubSystem)
  • 运行时数据区(Runtime Data Areas)
  • 执行引擎(Execution Engine)

# 2.1 类加载器子系统

类加载器子系统负责加载 class 文件,class 文件在文件开头有特定的文件标识,将 class 文件字节码内容加载到内存中,并将这些内容转换成方法区中的运行时数据结构,并且类加载器只负责 class 文件的加载,至于其是否可以运行则有执行引擎决定。

加载的类信息存放于方法区中(方法区除了类信息之外,还会存放运行时常量池以及其它信息)。

# 2.1.1 类加载器分类

虚拟机自带的类加载器:

  • 启动类加载器(Bootstrap Class Loader)
  • 扩展类加载器(Extension Class Loader)
  • 应用类加器器(Application Class Loader)

用户自定义类加载器:java.lang.ClassLoader 的子类,用户可以定制类的加载方式。

# 2.1.2 双亲委派机制

当一个类加载器收到了类加载请求,首先不会尝试自己去加载此类,而是将其请求委派给父类去完成,父类也会将其尝试委派给自己的父类去完成,因此所有的加载请求都最终会传送到启动类加载器中。只有当父类加载器反馈自己无法完成这个请求的时候,也就是在自己的加载路径下没有找到所需要的 Class,子类加载器才会尝试自己去加载。

# 2.2 运行时数据区

运行时数据区是 JVM 最核心的部分,也是面试考察最多的,会开启专门的章节详述。

# 2.3 执行引擎

分配给运行时数据区的字节码将由执行引擎执行,执行引擎读取字节码并一一执行。执行引擎由 3 部分组成:解释器(Interpret)、即时编译器(JIT Compiler)和垃圾回收器(Garbage Collector)。

# 2.3.1 解释器

解释器读取字节码并一一执行。解释器的缺点是当一个方法被多次调用时,每次都需要解释。

# 2.3.2 即时编译器

即时编译器消除了解释器的缺点(一个方法调用多次,每次都需要解释),执行引擎将使用解释器进行解释转换,但是当它发现重复的代码时,会使用即时编译器来编译整个字节码并将其更改为 native 代码。该本机代码将直接用于提高系统性能的重复方法调用。

  1. 中间代码生成器(Intermediate Code generator):生成中间代码。
  2. 代码优化器(Code Optimizer):负责优化上面生成的中间代码。
  3. 目标代码生成器(Target Code Generator):目标代码生成器负责生成机器代码/native 代码。
  4. 探查器(Profiler):探查器是一个特殊的组件,它负责寻找识别该方法是否被多次调用。

# 2.3.3 垃圾回收器

垃圾收集器(Garbage Collector)是执行引擎的一部分,它收集/删除未引用的对象。垃圾回收可以通过调用System.gc()来触发,但不能保证执行。JVM 的垃圾收集器只收集那些由 new 关键字创建的对象。因此,如果创建了任何没有 new 的对象,可以使用 finalize 方法执行清理。

# 参考资料

JVM 系列总结主要参考以下资料:

  • 周志明《深入理解 JVM 虚拟机第三版》
  • 宋红康《详解 Java 虚拟机》
  • GitChat《JVM 核心技术 32 讲》
  • Java Virtual Machine Architecture In Java (opens new window)
上次更新: 2023/11/01, 03:11:44

JVM 类加载机制→

Theme by Vdoing | Copyright © 2022-2023 Will 蜀ICP备2022002285号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式