Java对象的创建过程

对象的创建过程:

类加载检查-->分配内存-->初始化零值-->设置对象头-->执行init方法

1、类加载检查:虚拟机遇到一条new指令时,先检查这个指令的参数能否在常量池中定位到一个类的符号引用,并检查这个符号引用代表的类是否已被ji加载、解析和初始化过。如果没有,则先进行类的加载过程。

2、分配内存:有两种方式

指针碰撞:假设Java堆中的内存是规整的,用过的内存在一边,空闲的在另一边,中间有一个指针作为分界点的指示器,所分配的内存就把那个指针向空闲那边挪动一段与对象大小相等的距离。

空闲列表:如果Java堆中的内存不是规整的,虚拟机必须维护一个列表,记录哪些内存块可用的,分配时从列表中找到一块足够大的空间划分给对象,并更新列表的记录。

在划分可用空间时,会遇到线程安全的问题。解决这个问题有两种方案。第一种:对分配内存空间的动作进行同步处理--虚拟机采用CAS配上失败重试的方式保证更新操作的原子性。另一种是把内存分配的动作安装现场划分在不同的空间之中进行,即每个线程在Java堆中预先分配一小块内存,称为本地线程分配缓冲(TLAB)。那个线程需要分配内存,就在哪个线程的TLAB上分配,只有TLAB用完并分配新的TLAB时,才需要同步锁定。是否使用TLAB,-XX:+UseTLAB参数来设定。

3、初始化零值 将分配到的内存空间都初始化为零值,如果用TLAB,则在TLAB分配时初始化为零值。

4、设置对象头:主要设置类的元数据信息、对象的哈希码、对象的GC分代年龄等信息。

5、执行init方法初始化。

 

深入理解Java虚拟机

你可能感兴趣的:(Java底层)