本文将深入探讨HotSpot虚拟机中Java堆中对象分配、布局和访问的全过程。
对象的创建
在Java中,创建对象通常使用new
关键字,而在JVM中,创建对象的过程如下:
1、类加载检查
JVM首先检查new
指令所引用的类是否已加载、连接和初始化。
如果没有,会先执行类加载过程。
本文将深入探讨HotSpot虚拟机中Java堆中对象分配、布局和访问的全过程。
在Java中,创建对象通常使用new
关键字,而在JVM中,创建对象的过程如下:
1、类加载检查
JVM首先检查new
指令所引用的类是否已加载、连接和初始化。
如果没有,会先执行类加载过程。
运行时数据区是指在运行程序时存储数据的内存区域。分为程序计数器、Java虚拟机栈、本地方法栈、Java堆和方法区五个部分。
想要窥探Java虚拟机内部的实现原理,最直接的路径就是编译自己的JDK。 尽管网络上有不少开源JDK实现,但OpenJDK无疑是最广泛使用的,我们将选择OpenJDK进行编译实战。
字节码指令集是Java虚拟机(JVM)能理解和执行的低级指令集合。具体保存在Java类文件(
.class
)的方法区部分,由操作码和操作数组成。
Opcode
): 一个字节长度的数字,代表某种特定操作Operands
): 跟随操作码之后的零至多个参数,用于该操作所需的数据由于JVM采用面向操作数栈而不是面向寄存器的架构,大多数指令都不包含操作数,只有一个操作码,指令参数存放在操作数栈中。
类的生命周期分为以下7个阶段,其中解析可以在初始化之后,以支持Java的运行时绑定特性。
注:并非所有的类都会经历完整的生命周期,有些类可能在某些阶段就结束其在JVM中的生涯。
1、初始化时机的六种情况称为“主动引用”
Java虚拟机(Java Virtual Machine,简称JVM)是运行所有Java程序的虚拟计算机,是Java平台的核心实现。 它提供了一种独立于底层硬件和操作系统的运行环境,使Java程序能够在任何安装了JVM的系统上执行。 JVM通过将Java字节码(.class文件)转换为机器码来实现跨平台运行,这一特性被称为“Write Once, Run Anywhere”。
随着发展,JVM不再是Java独享的Moment,越来越多的语言开始在JVM上运行,使JVM逐渐演变成一个跨平台开发的通用平台。
计算机只能运行由0和1构成的二进制格式。 要运行Java程序,必须先通过Java虚拟机(JVM)执行编译后的Java代码,这个编译后的代码就是Java字节码,存储在
.class
类文件中。
Java字节码具有“平台无关性”和“语言无关性”。