java对象创建步骤
-
图示
-
虚拟机遇到⼀条new指令时,⾸先检查这个对应的类能否在常量池中定位到⼀个类的符号引⽤
-
判断这个类是否已被加载、解析和初始化
-
为这个新⽣对象在Java堆中分配内存空间,其中Java堆分配内存空间的⽅式主要有以下两种
指针碰撞 分配内存空间包括开辟⼀块内存和移动指针两个步骤 ⾮原⼦步骤可能出现并发问题,Java虚拟机采⽤CAS配上失败重试的⽅式保证更新操作的原⼦性 空闲列表 分配内存空间包括开辟⼀块内存和修改空闲列表两个步骤 ⾮原⼦步骤可能出现并发问题,Java虚拟机采⽤CAS配上失败重试的⽅式保证更新操作的原⼦性
-
指针碰撞:在堆中有2部分,空闲内存和使用内存
-
将指针往左移动,移动后产生的新内存给对象使用,这就是指针碰撞
-
空闲列表
有1张表,用于存储堆内存的空闲情况 空闲列表维护的是堆内存中不规则不连续的空闲区域 当某块内存被用后,就会从空闲列表中移除
- 将分配到的内存空间都初始化为零值
例如某个属性为int,则默认值为0 当属性为String时,则默认值为null
- 设置对象头相关数据
GC分代年龄 对象的哈希码 hashCode 元数据信息
-
执⾏对象init⽅法,也就是static方法
-
案例
在1个实体类中,先执行static方法,再执行无参构造方法,最后执行其他方法(例如set方法)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
2021-09-15 ts基础