对象实例化过程

目录

一、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文件编译后 在字节码文件里面生成的,他是一个实例构造器,会把变量初始化,完成初始化动作。

相关推荐
唐青枫11 小时前
Java Flyway 实战指南:用 SQL 脚本管理数据库版本
java
huangdong_18 小时前
电商平台图片URL原图转换技术深度解析:从缩略图到高清原图的完整方案
java·后端·spring
記億揺晃着的那天18 小时前
Java 调用外部 Go 程序的实践:ProcessBuilder 在生产环境中的应用
java·golang·processbuilder
JAVA面经实录91718 小时前
Java 数据结构与算法 (终极完整学习文档)
java·数据结构·算法
JAVA面经实录91719 小时前
操作系统面试题
java·服务器·数据库·计算机网络·面试
一杯奶茶¥19 小时前
基于springboot的失物招领管理系统带万字文档 校园失物招领管理系统 失物认领管理系统java springboot vue
java·vue.js·spring boot·java项目
不能只会打代码19 小时前
边缘视频分析平台的架构设计与性能优化——从750ms到190ms的调优之路
java·spring boot·redis·性能优化·边缘计算·物联网竞赛
小刘|19 小时前
Spring AI Alibaba 集成和风天气 API 实战
java·服务器·前端
KANGBboy19 小时前
java知识五(继承)
java·开发语言
AI人工智能+电脑小能手20 小时前
【大白话说Java面试题 第117题】【并发篇】第17题:线程有几种状态,之间如何转换?
java·开发语言·面试