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

java对象的创建过程

一.类的加载与检查

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

二.分配内存

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

指针碰撞

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

空闲列表

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

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

三.初始化

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

四.设置对象头

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

五.执行init方法

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

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

相关文章:

  • Salesforce创建一个页面,能够配置各种提示语,而不需要修改代码
  • 轻松管理MySQL权限:Python脚本带你飞
  • Py之transformers_stream_generator:transformers_stream_generator的简介、安装、使用方法之详细攻略
  • 2023年Zotero最新同步教程-使用TeraCloud的25G免费空间实时跨设备同步文献
  • 面试题:用宏定义写出swap(x,y),即交换两数。
  • 微服务框架SpringcloudAlibaba+Nacos集成RabbitMQ
  • 低代码开发,一场深度的IT效率革命
  • 虚拟串口软件使用介绍
  • 如何编写一份完整的软件测试报告?(进阶版)百分之90不知道
  • python企业微信小程序发送信息
  • Java入门篇 之 逻辑控制(练习题篇)
  • Android Google登录并获取token(亲测有效)
  • npm ERR! code ELIFECYCLE
  • Mgeo:multi-modalgeographic language model pre-training
  • [激光原理与应用-75]:西门子PLC系列选型
  • Linux上编译sqlite3库出现undefined reference to `sqlite3_column_table_name‘
  • 第十五章 EM期望极大算法及其推广
  • 自动化测试如何准备测试数据
  • javaEE -13(6000字CSS入门级教程 - 2)
  • vscode 使用python无法导入库
  • 三维向量旋转
  • 顺序表——leetcode
  • Kaprekar 7641 - 1467= 6174
  • 李宏毅机器学习笔记.Flow-based Generative Model(补)
  • Java使用Spark入门级非常详细的总结
  • kubernetes集群编排——k8s存储
  • 【软件STM32cubeIDE下H73xx配置串口uart1+中断接收/DMA收发+HAL库+简单数据解析-基础样例】
  • jdk8和jdk9中接口的新特性
  • 1-爬虫-requests模块快速使用,携带请求参数,url 编码和解码,携带请求头,发送post请求,携带cookie,响应对象, 高级用法
  • java商城免费搭建 VR全景商城 saas商城 b2b2c商城 o2o商城 积分商城 秒杀商城 拼团商城 分销商城 短视频商城