对象实例化过程

目录

一、Java对象实例化在JVM中的过程:

类加载与初始化

分配内存

初始化对象内存

设置对象头

执行初始化方法

构造方法执行

二、对象的创建过程


一、Java对象实例化在JVM中的过程:

类加载与初始化:
  • 当JVM需要实例化一个对象时,它首先会检查目标类是否已经被加载和初始化。
  • 如果类没有被加载,JVM会通过类加载器(ClassLoader)将类的字节码文件加载到内存中,并为其生成对应的Class对象。
  • 加载完成后,JVM会进行类的初始化,这包括执行类中的静态变量初始化、静态代码块等。
分配内存:
  • 一旦类完成初始化,JVM会根据目标类的大小在堆内存中为其分配内存空间。
  • 内存分配的方式取决于Java堆内存的规整性,可能采用指针碰撞或空闲列表。
初始化对象内存:
  • 为对象分配内存后,JVM会将对象的普通成员变量(实例变量)初始化为默认值(如int为0,String为null)。
  • 这一步确保对象在构造方法执行前,其字段已经是确定的默认值,可以安全地被访问。
设置对象头:
  • JVM还会为新创建的对象设置对象头信息,包括对象的哈希码、GC分代年龄、锁状态等,以及对象的类元信息(指向Class对象的指针)。
执行初始化方法:
  • 对于Java程序来说,对象的创建在JVM层面完成后,还需要执行Java代码层面的初始化。
  • 这包括执行由编译器自动生成的<init>方法(也称为实例构造器或构造器方法),该方法会初始化成员变量的值,执行实例初始化块(非静态代码块),并最终调用目标对象的构造方法。
构造方法执行:
  • 构造方法是Java程序员在类中定义的,用于初始化对象的特殊方法。
  • 当构造方法执行完毕后,一个完全初始化的Java对象就创建完成了。

二、对象的创建过程

1、实例化一个对象,jvm首先会检查目标对象是否被加载并**初始化,**如果没有需要立刻去加载目标类,然后调用目标类的构造器完成初始化。

2、目标的加载通过类加载器来实现,主要是把一个类加载到内存中

3、然后是初始化的过程,主要是对目标类里面的静态变量、成员变量、静态代码块进行初始化,

4、当目标类被初始化以后,就可以从常量池里面去找到对应的类元信息了,并且目标对象的大小在类加载完之后就确定了,所以就需要为新创建的对象根据目标对象的大小在堆内存里面去分配内存空间,内存分配的方式2种,1、指针碰撞,2、空闲列表。

5、jvm会根据java堆内存是否规整来决定内存的分配方法,然后jvm会把普通成员变量初始化为0值,int-->0,string--> null。 主要是为了保证对象里面的实例字段不用初始化就可以直接使用,也就是程序能够直接获取这些字段,对应的数据类型的0值,

6、然后还需要对目标对象的对象头做一些设置,比如对象所属的类元信息 。 对于jvm来说 新对象的创建工作完成了,但是对于java语言来说,对象创建刚刚开始,接下来要做的就是执行目标对象内部生成的init方法,初始化成员变量的值,执行构造块、最后调用目标对象的构造方法,完成对象创建。init java文件编译后 在字节码文件里面生成的,他是一个实例构造器,会把变量初始化,完成初始化动作。

相关推荐
考虑考虑7 小时前
JDK26中的Map.ofLazy
java·后端·java ee
鶴哥只手遮天11 小时前
Spring AI 2.0.1 深度解析-第 14 章 MCP 服务端(上):注解式实现与工具来源
java·人工智能·开源
鶴哥只手遮天11 小时前
Spring AI 2.0.1 深度解析-第 15 章 MCP 服务端(下):三种协议形态、Streamable 传输与状态管理
java·人工智能·开源
鶴哥只手遮天11 小时前
Spring AI 2.0.1 深度解析-第 16 章 向量存储(上):`VectorStore` 接口体系、`BatchingStrategy`
java·人工智能·开源
鶴哥只手遮天11 小时前
Spring AI 2.0.1 深度解析-第 12 章 工具循环的流式形态、Usage 累加与扩展体系
java·人工智能·开源
鶴哥只手遮天11 小时前
Spring AI 2.0.1 深度解析-第 23 章 模型供应商实现:从 `OpenAiSetup` 到 Bedrock
java·人工智能·开源
鶴哥只手遮天11 小时前
Spring AI 2.0.1 深度解析-第 06 章 内置 Advisor 全景:13 个实现逐个剖到源码级
java·人工智能·开源
鶴哥只手遮天11 小时前
Spring AI 2.0.1 深度解析-第 03 章 消息体系与 Prompt:不可变模型、`ChatOptions` 与模板渲染
java·人工智能·开源
鶴哥只手遮天11 小时前
Spring AI 2.0.1 深度解析-第 24 章 生产实践与 2.x 迁移:陷阱清单、AOT 与调优
java·人工智能·开源
鶴哥只手遮天11 小时前
Spring AI 2.0.1 深度解析-第 10 章 工具调用(中):执行链路、结果转换与工具限制
java·人工智能·开源