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

对象实例化过程

目录

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

类加载与初始化

分配内存

初始化对象内存

设置对象头

执行初始化方法

构造方法执行

二、对象的创建过程


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

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

http://www.lryc.cn/news/387742.html

相关文章:

  • 常见漏洞之XSS
  • Python变量的命名规则与赋值方式
  • 昇思25天学习打卡营第7天|网络构建
  • 扩展阅读:什么是中断
  • git 命令学习之branch 和 tag 操作
  • 如何理解 IEEE 754 单精度浮点型能表示的最小绝对值、最大绝对值
  • LeetCode 算法:二叉树的右视图 c++
  • Java 并发编程常见问题
  • 网络基础:静态路由
  • 库存管理系统基于spingboot vue的前后端分离仓库库存管理系统java项目java课程设计java毕业设计
  • 【ArcGIS AddIn插件】【可用于全国水旱灾害风险普查】全网最强洪水淹没分析插件-基于8邻域种子搜索算法-有源淹没分析算法
  • ==和equals的区别(面试题)
  • 本地项目上传到GitHub上(李豆)
  • 碧海威L7云路由无线运营版 confirm.php/jumper.php 命令注入漏洞复现(XVE-2024-15716)
  • redis实战-添加商户缓存
  • SQL游标的基本使用方法与示例
  • 还不知道工业以太网和现场总线区别???
  • 量化交易 - 策略回测
  • Java--选择排序
  • Python基础之模块和包
  • 基于SpringBoot漫画网站系统设计和实现(源码+LW+调试文档+讲解等)
  • Mysql----表的约束
  • 如何用 PHP 实现一个自定义爬虫框架
  • 【机器学习】机器学习的重要方法——强化学习:理论,方法与实践
  • Linux磁盘监控思路分析
  • pc端制作一个顶部固定的菜单栏
  • ONLYOFFICE 8.1版本桌面编辑器深度体验:创新功能与卓越性能的结合
  • 使用Java连接数据库并且执行数据库操作和创建用户登录图形化界面(2)
  • socket编程常见操作
  • springcloud-config git配置源加载(部署公钥问题)