跳至主要內容
深入理解Java虚拟机

前言(Preface)

致谢(Acknowledgements)

第一部分 走近Java(Part 1: Approaching Java)


流浪码客原创大约 3 分钟JVMjvm
堆中对象分配、布局和访问的全过程

本文将深入探讨HotSpot虚拟机中Java堆中对象分配、布局和访问的全过程。

对象的创建

在Java中,创建对象通常使用new关键字,而在JVM中,创建对象的过程如下:

1、类加载检查

JVM首先检查new指令所引用的类是否已加载、连接和初始化。 如果没有,会先执行类加载过程


流浪码客原创大约 2 分钟JVMjvm
运行时数据区

运行时数据区是指在运行程序时存储数据的内存区域。分为程序计数器、Java虚拟机栈、本地方法栈、Java堆和方法区五个部分。

Java虚拟机运行时数据区
Java虚拟机运行时数据区
  • 线程私有:
    • 程序计数器 - 存储线程执行位置
    • 虚拟机栈 - 存储Java方法调用与执行过程的数据
    • 本地方法栈 - 存储本地方法的执行数据
  • 线程共享:
    • - 主要存储对象
    • 方法区 - 存储类/方法/字段等定义(元)数据
    • 运行时常量区 - 保存常量static数据

流浪码客原创大约 6 分钟JVMjvm
实战编译JDK

想要窥探Java虚拟机内部的实现原理,最直接的路径就是编译自己的JDK。 尽管网络上有不少开源JDK实现,但OpenJDK无疑是最广泛使用的,我们将选择OpenJDK进行编译实战。

获取源码


流浪码客原创小于 1 分钟JVMjvm
字节码指令集

字节码指令集是Java虚拟机(JVM)能理解和执行的低级指令集合。具体保存在Java类文件(.class)的方法区描述中。

总数不超过256个,由操作码操作数 组成。

  • 操作码(Opcode): 一个字节长度的数字,代表某种特定操作
  • 操作数(Operands): 跟随操作码之后的零至多个参数,用于该操作所需的数据

流浪码客原创大约 10 分钟JVMjvm
类加载机制

类的生命周期

类的生命周期将会经历加载 (Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading)七个阶段

  • 其中加载、验证、准备、初始化和卸载这五个阶段的顺序是确定的,按部就班地开始。
  • 解析阶段不一定,某些情况下可以在初始化之后,以支持Java的运行时绑定(动态绑定)特性。

流浪码客原创大约 11 分钟JVMjvm
Java虚拟机概述

Java虚拟机(Java Virtual Machine,简称JVM)是运行所有Java程序的虚拟计算机,是Java平台的核心实现。 它提供了一种独立于底层硬件和操作系统的运行环境,使Java程序能够在任何安装了JVM的系统上执行。 JVM通过将Java字节码(.class文件)转换为机器码来实现跨平台运行,这一特性被称为“Write Once, Run Anywhere”。

跨平台开发的通用平台

随着发展,JVM不再是Java独享的Moment,越来越多的语言开始在JVM上运行,使JVM逐渐演变成一个跨平台开发的通用平台


流浪码客原创大约 10 分钟JVMjvm
类文件结构

代码编译的结果从本地机器码转变为字节码,是存储格式发展的一小步,却是编程语言发展的一大步。

无关性的基石

字节码是构成平台无关性和的语言无关性基石:

  • 平台无关性:
    • 字节码不依赖特定操作系统或硬件架构,任何支持JVM的环境(如WindowsLinuxmacOS、甚至嵌入式设备)都能运行相同的字节码,实现 “一次编写,到处运行”。
  • 语言无关性:
    • 多种编程语言(如JavaKotlinScalaGroovy)都可以编译成字节码,并在JVM(如GraalVM)上运行,不仅限于Java。

流浪码客原创大约 19 分钟JVMjvm