【jvm】从字节码角度看待对象创建流程

news/2024/11/27 20:54:12/

目录

          • 1. 分配内存空间
          • 2. 初始化内存空间为零值
          • 3. 设置对象头
          • 4. 调用构造函数初始化对象
          • 5. 示例代码
          • 6. 字节码指令解析

1. 分配内存空间
  • 1.在Java中,对象存储在堆(Heap)内存中。
  • 2.当创建一个新对象时,JVM首先需要为对象分配一块内存空间。
  • 3.指针碰撞(Bump the Pointer):如果堆内存是规整的(即没有内存碎片),JVM会通过一个指针来跟踪当前已分配的内存位置,并将指针向前移动一段空间来为新对象分配内存。
  • 4.空闲列表(Free List):如果堆内存是不规整的,JVM会维护一个空闲列表来记录哪些内存块是可用的,然后从中选择一个合适的内存块为新对象分配内存。
2. 初始化内存空间为零值
  • 1.在分配内存之后,JVM会将分配的内存空间初始化为零值(即所有的基本数据类型都被初始化为默认值,如int为0,boolean为false等)。
  • 2.这一步骤是为了确保对象字段的初始状态是确定的。
3. 设置对象头
  • 1.对象头(Object Header)包含了一些对象的元数据,比如对象的哈希码(hash code)、GC分代年龄(GC Age)、锁状态标志(lock status)以及类型指针(指向对象的类元数据的指针)。
4. 调用构造函数初始化对象
  • 1.最后一步是调用对象的构造函数来初始化对象的成员变量。
  • 2.这一步骤通常通过invokespecial字节码指令来完成。
  • 3.invokespecial指令用于调用实例初始化方法(方法)、私有方法以及父类方法。
5. 示例代码
  • 1.类代码
public class MyClass {int value;MyClass(int value) {this.value = value;}
}
  • 2.使用javap -c MyClass.class命令查看字节码
public class com.learning.MyClass {int value;com.learning.MyClass(int);Code:0: aload_01: invokespecial #1                  // Method java/lang/Object."<init>":()V4: aload_05: iload_16: putfield      #2                  // Field value:I9: returnpublic static void main(java.lang.String[]);Code:0: new           #3                  // class com/learning/MyClass3: dup4: bipush        106: invokespecial #4                  // Method "<init>":(I)V9: astore_110: return
}
6. 字节码指令解析
  • 1.new #3:new指令用于在堆上分配MyClass类型的新对象实例。#3是对常量池中MyClass类的符号引用。

  • 2.dup:dup指令复制栈顶元素(即新创建的对象引用),这样栈顶就有两个对象引用。

  • 3.bipush 10:bipush指令将操作数栈顶的值设为10(即构造函数的参数)。

  • 4.invokespecial #4:invokespecial指令调用实例初始化方法(即MyClass的构造函数)。#4是对常量池中方法的符号引用。

  • 5.astore_1:astore_1指令将栈顶的对象引用存储到局部变量表的第1个位置(局部变量0是args数组)。


http://www.ppmy.cn/news/1550439.html

相关文章

HTML飞舞的爱心

目录 系列文章 写在前面 完整代码 代码分析 写在后面 系列文章 序号目录1HTML满屏跳动的爱心&#xff08;可写字&#xff09;2HTML五彩缤纷的爱心3HTML满屏漂浮爱心4HTML情人节快乐5HTML蓝色爱心射线6HTML跳动的爱心&#xff08;简易版&#xff09;7HTML粒子爱心8HTML蓝色…

unity小:URP下shaderGraph管道流光效果(节奏速率可控)

效果预览 实现原理 该效果的核心原理是利用时间变量&#xff08;time&#xff09;的变化结合正弦函数&#xff08;sine&#xff09;的特性来动态改变UV坐标。通过这种方式&#xff0c;我们可以实现动画效果。具体实现步骤如下&#xff1a; UV坐标动态变化&#xff1a;通过时间…

修改Android Studio项目配置JDK路径和项目Gradle路径的GUI工具

概述 本工具提供了一个基于Python Tkinter的图形用户界面&#xff08;GUI&#xff09;&#xff0c;用于帮助用户搜索并更新Android Studio项目中的config.properties文件里的java.home路径&#xff0c;以及workspace.xml文件中的last_opened_file_path路径。该工具旨在简化手动…

World of Warcraft /script SetRaidTarget(“target“, n, ““) n=8,7,6,5,4,3,2,1,0

魔兽世界执行当前目标标记方法 /script SetRaidTarget("target", n, "") n8,7,6,5,4,3,2,1,0 解析这个lua脚本 D:\Battle.net\World of Warcraft\_classic_\Interface\AddOns\wMarker wMarker.lua /script SetRaidTarget("target", 8, &quo…

怎么在宿主机上通过ssh连接虚拟机 VirtualBox 中的linux系统

通过 Xshell 连接 VirtualBox 中的 linux 虚拟机&#xff0c;您需要确保以下几个步骤都正确配置&#xff1a; 1. 配置 VirtualBox 网络 您需要将 VirtualBox 虚拟机的网络适配器设置为支持 SSH 连接的模式&#xff1a; 打开 VirtualBox&#xff0c;选择您的 Ubuntu 虚拟机&am…

学习笔记032——Spring学习笔记

文章目录 一、Spring开发步骤二、Spring配置文件1、Bean标签基本配置2、Bean标签范围配置3、Bean生命周期配置4、Bean实例化三种方式5、Bean的依赖注入概念6、Bean的依赖注入方式【第一种&#xff1a;set方法注入】【第二种&#xff1a;构造方法注入】 7、Bean的依赖注入的数据…

Springboot下导入导出excel

目录 1. Apache POI1.1 引入Apache POI依赖1.2 用法&#x1f497;1.2.1 创建Excel的元素1.2.1.1 创建 WokrBook1.2.1.2 创建 Sheet1.2.1.3 创建行 Row1.2.1.4 创建单元格 Cell1.2.1.5 填充数据1.2.1.6 生成文件 &#x1f499;1.2.2 样式和字体1.2.2.1 左右垂直居中1.2.2.2 字体…

想自学成黑客(白帽子),零基础小白如何自学黑客(网络安全)?

前言&#xff1a;如何系统的自学黑客&#xff1f;最近很多小伙伴和粉丝都想自学成黑客&#xff08;白帽子&#xff09;&#xff0c;那么零基础小白该从哪里开始学呢&#xff1f; 在学习之前&#xff0c;要给自己定一个目标或者思考一下要达到一个什么样的水平&#xff0c;是学完…