JAVA对象创建过程
在语言层面上,创建对象List<String> list = new ArrayList<>()
,在虚拟机层面上,遇到一条字节码new指令时,创建对象的过程主要分为如下几个步骤:
-
检查指令的参数是否能在常量池中定位到一个类的符号引用,检查这个符号引用代表的类是否已经被加载、解析和初始化。
如未加载,则执行类加载过程:
-
类检查通过,为新生对象分配内存
- 堆中内存绝对规整 -> “指针碰撞”
- 将指针向内存空闲方向挪动一段与对象大小相同的距离
- 堆中内存并不规整 -> “空闲列表”
- 由虚拟机维护列表记录哪些内存块可用
- 由Java堆是否规整决定,决定堆规整又由GC器是否带有空间压缩整理的能力决定
- 带有压缩整理过程的收集器 -> 指针碰撞 ->
Serial
,ParNew
- 基于清除算法的收集器 -> 空闲列表 ->
CMS
- 带有压缩整理过程的收集器 -> 指针碰撞 ->
- 保证并发环境下内存分配的线程安全
- 对分配内存空间的动作进行同步处理 -> CAS+失败重试
- 把内存分配的动作按照线程划分在不同的空间之中进行 -> 本地线程分配缓冲TLAB
- 堆中内存绝对规整 -> “指针碰撞”
将分配到的内存空间(不包括对象头)初始化为零值
-
对对象进行必要的设置,将信息存放在对象的对象头中
- 对象所属类实例
- 类元数据信息获取方式
- 对象哈希码
- 对象GC分代年龄
- ……
调用Class文件中的
<init>()
方法