创建对象步骤

创建对象步骤

1. 判断对象对应的类是否加载、链接、初始化

虚拟机遇到new指令,首先去检查这个指令的参数能否在Metaspace的常量池中找到一个类的符号引用,并且检查这个符号引用代表的类是否已经被加载、解析、初始化。(即判断类元信息是否存在)如果没有,那么在双亲委派的模式下使用当前类的加载器以ClassLoader+包名+类名为key进行查找对应的.class文件。如果没有找到该文件,则抛出ClassNotFindException异常,如果找到则进行类加载,并生成对应的Class类对象。

2. 为对象分配内存

首先计算对象占用空间大小,接着在堆中划分一块内存给新对象。如果实例成员变量是引用类型,仅分配引用变量空间即可,即4个字节大小

      2.1 如果内存规整:指针碰撞(如果内存规整,那么虚拟机采用的是指针碰撞【Bump The Pointer】来为对象分配内存。意思是所有用过的内存在一边,空闲的内存在另一边,中间放置一个指针来作为分界点的指示器,分配内存就仅仅是把指针向空闲的那边挪动一段与对象大小相等的距离罢了。如果垃圾收集器选择是的Serial、ParNew这种基于标记压缩算法的话,虚拟机采用这种分配方式,一边带有【compact】整理过程的收集器,使用指针碰撞)

      2.2 如果内存不规整

            2.2.1 虚拟机维护一个空闲列表

            2.2.2 空闲列表分配:如果内存不规整,已使用和未使用的内存相互交错,那么虚拟机采用空闲列表法来为对象分配内存。空闲列表上记录类那一块内存是可用的,在分配的时候从列表中找到一块足够大的空间划分给实例对象,并跟新列表上的内容。这种分配方式称为“空闲列表【Free List】”

3. 处理并发安全问题

      3.1 采用CAS配上失败重试保证跟新的原子性

      3.2 每个线程预先分配一块TLAB:通知-XX:UseTLAB参数来设定

4. 初始化分配到空间

      4.1 所有的属性设置默认值,保证对象实例字段在不赋值时可以直接使用

5. 设置对象头

将对象的所属类(即类的元数据信息)、对象的HashCode和对象的GC信息、锁信息等存储在对象的对象头中。这个过程的具体设置方式取决于JVM实现

6. 执行ini方法进行初始化

在Java程序的视角来看,初始化才刚刚开始。初始化成员变量,执行实例代码块,调用类的构造方法,并把堆内对象的首地址赋值给引用变量。因此一般来说,(有字节码中是否跟随有invokespecial指令所决定),new指令之后会接着执行方法,把对象按照程序员的意愿进行初始化,这样一个真正可用的对象才算完全创建出来

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值