普通的java对象的创建
1、创建对象(克隆、反序列化、new)不包括数组和Class对象
2、检查这个指令的参数是否能在常量池中定位到一个类的符号引用
3、检查这个符号引用所代表的类是否已经被正确加载、解析、初始化,如果没有执行类加载
4、虚拟机对对象分配内存
虚拟机为新生对象分配内存
- 内存分配方式
1、指针碰撞
2、空闲列表
3、采用哪种分配方式主要取决于java堆的GC算法 其中包含 compact(复制 压缩)过程的采用指针碰撞(serial、parNew)而使用类似CMS这种基于Mark-Sweep算法的分配方式是空闲列表
- 如何防止分配内存时的并发问题
1、采用CAS配上失败重试方式保证原子性
2、为每个线程预先分配内存缓冲 TLAB (Thread Local Allocation Buffer)
只有TLAB用尽 并需要分配新的TLAB时才触发同步锁定
5、虚拟机将分配到的内存空间初始化零值(不包括对象头)保证对象的实例字段在java代码中可以访问到零值,并可以不赋值就可以使用
6、对对象进行对象头的必要设置包括(属于哪个实例、如何找到元数据信息、哈希码、GC分代年龄)
7、执行 方法