Java创建对象的过程(类实例化)

[亡魂溺海] 提交于 2020-08-06 13:32:41

1.检查类是否被加载。

当虚拟机遇到new指令后,会先去常量池检查有没有该类的符号引用,并且检查这个类有没有进行加载、解析、初始化过,没有就先执行类加载过程。

2.为对象分配内存空间*。

在完成类加载后,对象的内存大小就已经确定了。此时为对象分配内存就是在Java堆中划分出一块确定大小的内存。
划分方式有指针碰撞空闲列表两种方式,使用哪种由Java堆是否齐整决定,而Java堆的齐整与否又由使用哪种 GC算法决定。

3.初始化对象。

分配完内存后,虚拟机会将分配的内存空间除对象头以外进行初始化零值。

4.设置对象头。(对象头的内容..?)

虚拟机需要对对象进行必要的设置。如该对象是哪个类的实例、这个类的元数据信息、对象的哈希吗、对象的GC分代年龄等。
此外,根据虚拟机运行状态的不同(如是否使用偏向锁),对象头的设置都有所不同。

5.执行init()。

进行完上述操作,对于虚拟机而已这个对象是创建好了,但对于java而言才刚开始,一切字段都为0,还需执行init进行初始化,这样一个对象才算真正被创建。


内存分配的两种方式:
· 指针碰撞:(适用于堆规整,无内存碎片的情况下)用过的内存在一边,没用过的在另一边g是可用的,然后在没有使用过的内存中找出符合大小的内存空间。最后更新列表。

内存分配并发问题:
虚拟机使用两种方式为了保证创建对象时线程安全:
· TLAB:虚拟机会为每个线程在Eden区预先分配一段内存空间来存放对象,当创建对象时会先分配到TLAB中即可。如果TLAB空间不足以放下对象,就使用CAS+失败重试来分配。
· CAS+失败重试:假设没有冲突去分配内存,如果失败了就重新尝试,直到成功为止。

*需要研究一下: 深入理解Java对象的创建过程:类的初始化与实例化

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!