对象创建的几种方式
- new
- clone
- newInstance
- 反序列化
- String s = "abc"(这个是比较特殊的)
背景:接下来看下JAVA对象创建的整个过程,要理解每一步的意义,平时对基础知识还是要查缺补漏呀。先来看下整过过程的步骤。

类加载检查。
- 常量池定位new指令参数的符号引用
- 检查这个符号引用是否被类加载,解析和初始化过,如果没有先进行类加载过程
内存分配
- 类加载过后对象所需的内存大小就能确定
- 分配方式分为以下两种,基本原则是依据垃圾收集器是否压缩整理功能决定。
- 指针碰撞,规整的内存区域沿一个方向移动指针分配即可
- 空闲列表:JVM中记录一个已使用的列表,分配后再更新列表。
- 内存分配的并发问题的两种方案
- CAS+失败重试,CAS是一种乐观锁,每次不加锁而假设没有冲突的去完成某项操作,如果冲突则重试,直至成功,来保证原子性,缺点就是会出现频繁重试以至于浪费内存
- TLAB:为每个线程先分配一段内存,JVM再给线程中的对象分配内存是现在TLAB中分配,当对象需要的内存大于TLAB时,再采用上述的CAS机制分配对象内存
初始化零值
- 内存分配完成后,虚拟机需要将分配的内存空间都初始化零值(不包括对象头)
设置对象头
- 初始化零值之后,虚拟机要对对象进行必要的设置,例如设置这个对象是哪个类的实例,如何找到类的元数据信息,对象的hash码,对象的GC分代年龄等,这些信息都是存放在对象头中。
执行init方法
- 上面工作做完后,在虚拟机角度这个对象实例已经创建完成,但是从java程序看来对象的生命周期才刚刚开始。
- 执行INIT方法来按照程序员的意愿来初始化对象中变量的初值
至此一个对象实例已经创建完成
JAVA对象的生命周期(二)-对象的创建
原文:https://www.cnblogs.com/jimoliunian/p/12800640.html