java对象的创建
- java虚拟机遇到new指令会先去检查指令的参数能否在方法区的常量池定位到一个类的符号引用,然后检查符号引用代表的类是否被加载、解析、初始化。
- 类检查完毕后就要分配内存空间,对象所需的内存空间在类加载完毕就可确定,然后即可在堆内存中划分内存,此处有个问题在使用标记清楚垃圾回收算法会存在内存不连续,此时便会引出两种内存分配方式“指针碰撞”、“空闲列表”。
- 除如何划分内存外还需考虑个问题:对象的创建在虚拟机中是非常频繁的事件,此时使用移动指针的方式划分内存就会存在并发问题,此处有两种解决方案,第一种使用cas失败重试去修改指针,第二种每个线程预先在对内存中分配一部分内存专门内存分配当线程私有的内存空间使用完了就会使用cas分配(TLAB技术,可以使用-XX:+/-UseTLAB参数来开启或关闭)。
- 内存分配完成后就是将分配的内存空间都初始化为零值(此时不包括对象头),当使用了TLAB技术这项工作可提前到内存分配时。
- 接下来就是对对象进行一些必要的设置,例如设置实例的类信息,对象的哈希码(真正用到的时候才会计算),gc分代年龄这些信息存在对象头中
- 上面完成后才会执行构造方法()