当前位置: 首页 > article >正文

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

目录

          • 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_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: aload_0
       5: iload_1
       6: putfield      #2                  // Field value:I
       9: return

  public static void main(java.lang.String[]);
    Code:
       0: new           #3                  // class com/learning/MyClass
       3: dup
       4: bipush        10
       6: invokespecial #4                  // Method "<init>":(I)V
       9: astore_1
      10: 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.kler.cn/a/407873.html

相关文章:

  • Linux各种并发服务器优缺点
  • QT如何共享文件+拷贝文件
  • webStorm安装
  • AVL树实现
  • 设计LRU缓存
  • 【线程】Java线程操作
  • Claude Opus MetaPrompt 系统详解
  • 论文阅读 SimpleNet: A Simple Network for Image Anomaly Detection and Localization
  • 【C++】踏上C++学习之旅(十):深入“类和对象“世界,掌握编程黄金法则(五)(最终篇,内含初始化列表、静态成员、友元以及内部类等等)
  • Spring 中的 ProxyFactory 创建代理对象
  • i春秋-123(文件上传绕过,双写绕过)
  • Vue + Websocket播放PCM(base64转ArrayBuffer、 字符串转ArrayBuffer)
  • RabbitMQ 篇-深入了解延迟消息、MQ 可靠性(生产者可靠性、MQ 可靠性、消费者可靠性)
  • GitLab使用示例
  • 储能场站安全风险挑战
  • OceanBase数据库产品与工具介绍
  • 深入探讨 Puppeteer 如何使用 X 和 Y 坐标实现鼠标移动
  • 彻底理解如何保证Redis和数据库数据一致性问题
  • K8s 一键部署 MongoDB 的 Replica-Set 和 MongoDB-Express
  • 《AI大模型开发笔记》Faster-Whisper 免费开源的高性能语音识别模型
  • 国外云计算服务器租用攻略
  • QDUOJ(青岛大学在线评测系统)
  • 力扣 238. 除自身以外数组的乘积
  • muduo库的使用
  • 【数据结构】—— 双向循环链表
  • PaddleNLP的环境配置: