#### 1.对象的创建
**1.**一般情况下创建一个对象,java中使用new关键字。当java虚拟机遇到一条字节码new指令时,首先检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那么就先执行相应的类加载过程。
**2.**类加载检查通过后,虚拟机将为新生对象分配内存。根据java堆是否规整,或者所采用的垃圾收集器是否具备空间压缩整理能力,有两种内存分配方式:1.指针碰撞、2.空闲列表。
内存分配之中可能会涉及到并发的问题,有两种解决方案。
**1.**对分配内存空间的动作进行同步处理——实际上虚拟机是采用CAS配上失败重试的方式保证更新操作的原子性;
**2.**把内存分配的动作按照线程划分在不同的空间之中进行,即每个线程在java堆中预先分配一小块内存,成为本地线程分配缓冲(Thread Local Allocation Buff,TLAB),哪个线程要分配内存,就在哪个线程的本地缓冲区中分配,只有本地缓冲区用完了,分配新的缓存区时才需要同步锁定。
**3**.内存分配完成之后,虚拟机进行初始化操作。虚拟机将分配到的内存空间(不包括对象头)都初始化为0值,使用了TLAB的话,这一项工作可以提前至TLAB分配时进行。这部操作保证了对象的实例字段在java代码中可以不赋初值就直接使用,让程序能够访问到这些字段的数据类型对应的零值。