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

java对象的创建过程

一.类的加载与检查

当我们new了一个对象的时候,首先会去检查一下这个指令是否在常量池中存在符号引用,并且检查这个符号引用代表的对象是否被加载,解析初始化过,如果没有就要先去进行类加载过程

二.分配内存

我们通过第一步的检查后,就会在堆中划分出一块对象所需要的内存大小,至于分配方式有两种,指针碰撞,空闲列表。选择哪种分配方式由 Java 堆是否规整决定,而 Java 堆是否规整又由所采用的垃圾收集器是否带有压缩整理功能决定。

指针碰撞

适用于没有内存碎片的情况,原理:用过的内存全部整合到一边,没有用过的内存放在另一边,中间有一个分界指针,只需要向着没用过的内存方向将该指针移动对象内存大小位置即可。
使用该分配方式的 GC 收集器:Serial, ParNew

空闲列表

适用于堆内存不是很规则的情况下,原理就是找一块合适的内存来分配给对象,使用该分配方式的GC收集器 CMS

JAVA内存是否规则取决于垃圾回收器采用的是标记-整理法还是标记清除法

三.初始化

内存分配完成后,虚拟机需要将分配到的内存空间都初始化为零值(不包括对象头),这一步操作保证了对象的实例字段在 Java 代码中可以不赋初始值就直接使用,程序能访问到这些字段的数据类型所对应的零值。

四.设置对象头

初始化零值完成之后,虚拟机要对对象进行必要的设置,例如这个对象是哪个类的实例、如何才能找到类的元数据信息、对象的哈希码、对象的 GC 分代年龄等信息。 这些信息存放在对象头中。 另外,根据虚拟机当前运行状态的不同,如是否启用偏向锁等,对象头会有不同的设置方式。
 

五.执行init方法

在上面工作都完成之后,从虚拟机的视角来看,一个新的对象已经产生了,但从 Java 程序的视角来看,对象创建才刚开始,<init> 方法还没有执行,所有的字段都还为零。所以一般来说,执行 new 指令之后会接着执行 <init> 方法,把对象按照程序员的意愿进行初始化,这样一个真正可用的对象才算完全产生出来。
 

相关文章:

  • AI开源 - LangChain UI 之 Flowise
  • 贪心算法学习------优势洗牌
  • 请一个折腾了5个月AI绘画的人来讲讲GPU选择的经验,没入坑的看他这一篇就足够了
  • 婚姻管理系统-使用bbst数据结构
  • Python中文件copy模块shutil
  • JumpServer开源堡垒机与万里安全数据库完成兼容性认证
  • CentOS 搭建 Hadoop3 高可用集群
  • 消息认证码--数字签名--证书
  • GaussDB数据库管理系统介绍
  • SuperMap iServer 11i(2023)安全性提升汇总
  • 【leetCode算法-05】 最长回文子串 问题
  • centos7安装oxidized备份软件
  • opencv c++ canny 实现 以及与halcon canny的对比
  • Azure机器学习 - 使用与Azure集成的Visual Studio Code实战教程
  • QEMU/KVM 虚拟硬盘
  • 框架安全-CVE 漏洞复现DjangoFlaskNode.jsJQuery框架漏洞复现
  • BUUCTF ningen 1
  • 学PYTHON必须学算法吗?老程序员告诉你真相!
  • HTML标题、段落、文本格式化
  • Proteus仿真--基于51单片机的可演奏电子琴设计(仿真文件+程序)
  • B站一季度净亏损收窄99%:游戏营收大增76%,AI类广告收入增近4倍
  • 22国外长联合声明:要求以方立即允许全面恢复对加沙援助
  • 首付款12.5亿美元!三生制药与辉瑞就国产双抗达成合作协议
  • 上海徐汇 “家 + 书屋”,创新服务广大家庭
  • 这个死亡率第一的“老年病”,正悄悄逼近年轻人
  • 天问二号探测器顺利转入发射区,计划5月底择机发射