JVM

1.JVM对象的创建过程—— 以HotSpot为例

2018-08-28  本文已影响0人  幽游不想吃饭

1.类加载检查

当虚拟机收到一条new指令时,首先将检查当前new的类是否在常量池被加载过(在常量池找到需要new的类的符号,检查其是否被初始化过)。如果没有,则执行相应的类加载过程;如果有则直接准备为新的对象分配内存。

2.为新生对象分配内存

对象所需内存大小在类加载完成后就已确定,分配内存的过程等同于将一块确定大小的内存从java堆划分出来。分配方式有指针碰撞空闲列表两种,选择哪种分配方式由Java堆是否规整决定;Java堆是否规整又由选择的GC收集器是否带有压缩整理功能决定

2.1 两种分配内存的方式

2.1.1 指针碰撞

2.1.2 空闲列表

2.2 内存分配的并发问题解决

对象创建在虚拟机中属于频繁操作,这就涉及到了并发操作(当给对象A分配内存并且还没有分配完毕时,给对象B分配相同的的内存区域)。解决方案主要包括两种:CAS和TLAB

2.2.1 CAS+失败重试

CAS(compare and swap),每次假设不会发生冲突而去进行分配,冲突失败则自旋挂起,重试直到成功为止,减少用户态和内核态切换所需时间和资源占用。CAS+失败重试保证更新操作的原子性

2.2.2 TLAB

本地线程分配缓冲(Thread Local Allocation Buffer, TLAB),是否使用TLAB通过-XX:+/-UseTLAB参数设置,java层面与之对应的是ThreadLocal类的实现

分配过程:

3.初始化零值

4.设置对象必要参数

5.执行对象构造(init)方法

对于虚拟机来说,在执行init方法前,对象的创建已经结束了。但对于java程序来说,创建对象的过程还没有结束(在执行init方法之前,所有字段值均为零)。执行new指令后,会接着执行init方法,把对象按照程序员的想法进行初始化,才算完成了一个对象的创建。

上一篇 下一篇

猜你喜欢

热点阅读