前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >对象如何实例化

对象如何实例化

作者头像
在水一方
发布2022-06-14 15:30:51
发布2022-06-14 15:30:51
1.4K0
举报
文章被收录于专栏:在水一方在水一方

前言

平时开发时通过new来构建对象的实例。通过引用变量指向被创建的对象,并使用此引用变量操作对象,在实例化对象的过程中JVM到底发生了一些什么样的行为变化呢,这个问题在日常进行功能开发时可能并没有怎么去关注,本小节来对这部分知识点来进行学习,同时也加强一下对于jvm的认识

从执行步骤的角度来看

📚 1、确认类元信息是否存在。当jvm接收到new指令时,首先在metaspace内检查需要创建的类的元信息是否存在。若不存在,那么在双亲委派模式下使用当前类加载器以ClassLoader+包名+类名为key进行查找对应的.class文件,如果没有找到则抛出ClassNotFoundException,如果找到,则进行类加载,并生成对应的Class对象

🔥 2、分配对象内存。首先计算对象占用内存的空间大小,如果实例成员变量是引用变量,仅分配引用变量空间即可,即4个字节大小,接着在堆中划分一块内存给新对象,在分配内存空间时,需要进行同步操作,比如采用CAS失败重试、区域加锁等方式保证分配操作的原子性。

🔔 3、设定默认值。成员变量值都需要设定为默认值。即各种不同形式的零值

📗 4、设置对象头。设置新对象的哈希码、GC信息、锁信息、对象所属的类元信息等。这个过程的具体设置方式取决于jvm实现

📖 5、执行init方法。初始化成员变量,执行实例化代码块、调用类的构造方法,并把堆内对象的首地址复制给引用变量

💡 说明:在Hotspot虚拟机中,对象在内存中存储的布局可以分为3块区域:对象头(Header)、实例数据(Instance Data)、和对齐填充(Padding)

从字节码角度看对象的创建过程

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 从执行步骤的角度来看
  • 从字节码角度看对象的创建过程
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档