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

Java虚拟机对象创建过程

Java对象的创建过程

创建过程大致分成五步:

  1. 类加载检查
  2. 分配内存
  3. 初始化零值
  4. 设置对象头
  5. 执行init

接下来详细说明每一步执行的具体操作。

  1. 类加载检查
    首先检查这个指令能够在常量池中定位一个类的符号引用
    接着回去检查这个符号引用代表的类是否已经被加载、解析、初始化,如果没有的话那么会进行累加载的过程。

进行类加载之后就是分配内存了,类加载完成之后就可以确认类加载所需要的内存。

  1. 分配内存
    通俗来说就是给新创建的对象分配内存,现在分配内存有两种方式,分别是指针碰撞和空闲列表。
    首先指针碰撞指的是内存分配是在连续的内存空间中进行的。我们已经知道了对象使用的内存大小,直接在原来的末尾进行增加对应大小的内存就可以。第二种是空闲列表,对应于内存空间不连续的情况,那么就需要有一个表用来记录当前那个内存空间是空闲的,哪个空间是已经被使用的,内存分配的时候直接在表上进行申请就可以了。
  2. 初始化零值
    在分配完内存之后,虚拟机必须将分配到的内存空间都初始化成零值。这主要有两个原因,一方面是可以避免当前的内存空间有脏数据,另外一个原因是保证对象在创建的时候能够让Java代码在不赋值的时候可以直接访问使用,这样就可以使Java程序访问对应的数据类型的默认值。
    比如我们知道的int的默认值是0 boolean 的默认值是false。
  3. 设置对象头
    之后,Java虚拟机还需要对这些对象进行必要的设置,例如设置对象对应的类,对象的哈希码,对象的GC年龄等等,是否使用偏向锁等等。
  4. 执行init
    执行完上述的操作之后,对于虚拟机来说当前的对象已经创建完成了,但是现在对于Java视角来说还没有完成,所有的值都是默认值,还没有设置成用户设置的值,所以最后还会执行init方法执行对象的初始化。

最终完整的对象才被构建出来。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • MySQL使用LIKE索引是否失效的验证
  • 探索InitializingBean:Spring框架中的隐藏宝藏
  • 【SpringCloud应用框架】Nacos集群架构说明
  • 回溯法:生成一个字符串的所有排列组合
  • 计算组的妙用!!页面权限控制
  • 【web APIs】快速上手Day05(Bom操作)
  • Java求解百钱买百鸡问题(课堂实例2)
  • Ubuntu24.04LTS基础软件下载
  • SystemUIService启动-Android13
  • 高防服务器的重要性
  • 增量联邦学习是什么
  • 【JavaEE】多线程进阶
  • 华为路由器静态路由配置(eNSP模拟实验)
  • 动态规划 剪绳子问题
  • Rust变量绑定
  • SegmentFault for Android 3.0 发布
  • 【剑指offer】让抽象问题具体化
  • Fundebug计费标准解释:事件数是如何定义的?
  • Java 23种设计模式 之单例模式 7种实现方式
  • Netty 框架总结「ChannelHandler 及 EventLoop」
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • Vim 折腾记
  • 对话 CTO〡听神策数据 CTO 曹犟描绘数据分析行业的无限可能
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 理清楚Vue的结构
  • 利用DataURL技术在网页上显示图片
  • 详解NodeJs流之一
  • 正则与JS中的正则
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • NLPIR智能语义技术让大数据挖掘更简单
  • #DBA杂记1
  • #nginx配置案例
  • #systemverilog# 之 event region 和 timeslot 仿真调度(十)高层次视角看仿真调度事件的发生
  • #考研#计算机文化知识1(局域网及网络互联)
  • #微信小程序(布局、渲染层基础知识)
  • $LayoutParams cannot be cast to android.widget.RelativeLayout$LayoutParams
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (07)Hive——窗口函数详解
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (Git) gitignore基础使用
  • (八)c52学习之旅-中断实验
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (第8天)保姆级 PL/SQL Developer 安装与配置
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • (转)IOS中获取各种文件的目录路径的方法
  • (转)LINQ之路
  • .bat批处理(六):替换字符串中匹配的子串
  • .bat批处理出现中文乱码的情况
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .NetCore项目nginx发布
  • /proc/vmstat 详解
  • @ModelAttribute使用详解
  • @PreAuthorize注解