在虚拟机中,当遇到需要new一个对象时,虚拟机首先会去处于方法区的常量池中查找new指令的参数,即查找次类的符号引用是否已存在,并且检查此符号引用的代表的类是否已经做过加载、解析和初始化,如果做过则不会执行相应的类的加载过程,如果未做过,则先执行类的加载过程,执行完毕类加载过程后,虚拟机开始在堆区未此新生的对象分配内存。
分配内存方式:
1、指针碰撞方式:
分配过程:将分配内存的指针向内存空闲区域移动一段与对象大小相等的距离,为什么叫"指针碰撞”,因为如果并发new多个对象,指针移动很可能出现刚分配给A一段内存,但尚未完毕的时候,B也同时获得了这块内存,此时会发生对象内存碰撞现象。
2、空闲散列方式:
分配过程:虚拟机维护一个列表,记录可用内存块,每次从列表中寻找足够大的空间划分给对象实例后,更新列表记录。
防止并发分配内存策略:
1、采用CAS+失败重试方式报证更新操作的原子性。
2、按线程划分不同的空间,虚拟机预先为每个线程分配本地线程分配缓冲(TLAB),哪个线程要分配内存,则在哪个线程的TLAB上分配,当TLAB使用穷尽时,进行同步锁定即第一种方式。
内存分配完毕后,new操作完毕,接着,虚拟机开始执行init方法,将对象按照程序的要求进行初始化,次操作完毕后,一个完整的对象创建完毕。
原文:https://www.cnblogs.com/Yloon/p/12098897.html