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

目录

          • [1. 分配内存空间](#1. 分配内存空间)
          • [2. 初始化内存空间为零值](#2. 初始化内存空间为零值)
          • [3. 设置对象头](#3. 设置对象头)
          • [4. 调用构造函数初始化对象](#4. 调用构造函数初始化对象)
          • [5. 示例代码](#5. 示例代码)
          • [6. 字节码指令解析](#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数组)。

相关推荐
宸丶一9 小时前
Day 13:持久化记忆 - 让 Agent 拥有长期记忆
jvm·python·ai
cfm_291411 小时前
JVM新一代垃圾收集器深度解析:G1与ZGC
java·jvm
顺风尿一寸14 小时前
JVM 字段布局揭秘:Best‑Fit 算法如何为每个字段精准分配偏移量
jvm
小bo波16 小时前
Java反射机制——运行时"透视"类的秘密
java·jvm·反射·源码分析·动态代理·进阶·spring底层·框架原理
程序猿阿伟16 小时前
《拆解Chrome存储架构:浏览痕迹的残留死角与清除路径》
jvm·chrome·架构
于指尖飞舞17 小时前
java后端面试题(jvm极简)
java·开发语言·jvm
鹅城剑仙18 小时前
JVM 内存模型与 GC 调优实战指南
jvm
Javatutouhouduan18 小时前
2026年Java面试核心讲(终极版)全网首次开源!
java·jvm·java多线程·java面试·后端开发·java程序员·java八股文
程序员二叉1 天前
【JUC】线程池全套深度详解|参数|流程|拒绝策略|调优|异常处理
java·开发语言·jvm·算法·面试·juc
小马爱打代码1 天前
面试题:内存模型与垃圾回收深度解析
jvm