跳至主要內容
堆中对象分配、布局和访问的全过程

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

对象的创建

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

1、类加载检查

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


会敲代码的程序猿原创大约 2 分钟JVMJVM
运行时数据区

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

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

会敲代码的程序猿原创大约 6 分钟JVMJVM
深入理解Java虚拟机

前言(Preface)

致谢(Acknowledgements)

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


会敲代码的程序猿原创大约 3 分钟JVMJVM
实战编译JDK

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

获取源码


会敲代码的程序猿原创小于 1 分钟JVMJVM
字节码指令集

字节码指令集是Java虚拟机(JVM)能理解和执行的低级指令集合。具体保存在Java类文件(.class)的方法区部分,由操作码和操作数组成。

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

由于JVM采用面向操作数栈而不是面向寄存器的架构,大多数指令都不包含操作数,只有一个操作码,指令参数存放在操作数栈中。


会敲代码的程序猿原创大约 9 分钟JVMJVM
类加载机制

类的生命周期

类的生命周期分为以下7个阶段,其中解析可以在初始化之后,以支持Java的运行时绑定特性。

类的生命周期
类的生命周期

注:并非所有的类都会经历完整的生命周期,有些类可能在某些阶段就结束其在JVM中的生涯。

1、初始化时机的六种情况称为“主动引用”


会敲代码的程序猿原创大约 11 分钟JVMJVM
Java虚拟机概述

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

跨平台开发的通用平台

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


会敲代码的程序猿原创大约 9 分钟JVMJVM
类文件结构

计算机只能运行由0和1构成的二进制格式。 要运行Java程序,必须先通过Java虚拟机(JVM)执行编译后的Java代码,这个编译后的代码就是Java字节码,存储在.class类文件中。

跨平台的基石

Java字节码具有“平台无关性”和“语言无关性”。

  • 平台无关性: 字节码可以在任何支持JVM的平台上运行,实现“一次编写,到处运行”
  • 语言无关性: 多种编程语言可以编译成字节码并在JVM(GraalVM)上运行,不仅限于Java

会敲代码的程序猿原创大约 19 分钟JVMJVM