语言层面上,创建对象通畅仅仅是一个new搞定,在虚拟机中,过程是如何的?(不包括数组和Class对象)
虚拟机遇到一个new指令时
- 1,检查这个指令的参数是否能在常量池中定位到一个列的符号引用
- 2,检查这个符号引用代表的类是否已经被加载解析、和初始化过?
- 3,如果没有,则必须先执行相应的类的加载过程
- 4,类加载检查
- 5,虚拟机为新生对象分配内存,该内存在类加载完成后便完全确定的
分配内存: 指针碰撞、空闲列表
- 划分内存,并发情况下的线程安全问题:
1. 虚拟机采用CAS配上失败重试,保证更新操作的完整性
2. 把内存分配的动作按照线程划分在不同的空间中进行:TLAB
虚拟机是否使用TLAB : 通过设置=XX:+/ -UseTLAB 设定
内存分配好之后,虚拟机将分配的内存全部初始化为零值(不包括对象头)如果使用TLAB,这个工作过程提前到TLAB分配时进行,保证对象在不赋初始值的时候就有一个默认值,程序可以访问这些数据类型对应的零值
- 6 接下来对对象进行必要的设置,对象所属的类,元数据信息地址,对象的哈希码,GC分代年龄等,这些信息存放在对象头中,虚拟机的状态会影响对象头的内容。
网友评论