jvm对象创建流程与内存分配机制

一.jvm对象的创建
首先说明下,new一个子类,在创建时,子类和父类调用顺序:
父类静态块>子类静态块> 父类属性(先系统默认值,后直接你赋予的值) >父类构造器>子类属性>子类构造器
对象在类加载之后创建,主要存储在堆中,也有可能通过逃逸分析存储在栈中。以下是对象加载流程图。
jvm对象创建流程与内存分配机制_第1张图片
1.检查类加载
首先在new关键词、对象克隆、对象初始化时,jvm会去检查该对象对应的类对象是否已经被加载。具体操作是在常量池找到对应类的符号引用,检查这个类是否被加载、验证、准备、解析、初始化过、
2.分配内存
内存分配主要采用两种方式:
(1)指针碰撞(默认方式)
如果java堆中内存是绝对规整的,所有用过的内存放一边,未使用过的放一边,中间有一个指针作为临界点,如果新创建了一个对象则是把指针往未分配的内存挪动与对象内存大小的相同距离
(2)空闲列表
如果java堆中的内存空间不是规整的,就会维护一个空闲列表,用来记录剩余可用的空间,为对象分配内存时,就在空闲列表中取出大于当前对象大小的空间划分给对象
出现的问题
在并发的情况下,有可能同时有两个以上的对象申请。针对这种情况jvm采用了一下两种方式
(1)cas同步机制
(2)本地线程分配缓存(TALB):为每个线程在堆上预分配一块私有空间
3.初始化
将分配到的内存空间都初始化为0值,保证对象的实例字段不赋初始值也能使用,即直接使用0值
4.设置对象头
对象在内存中存储的布局可以分为3块区域:对象头(Header)、 实例数据(Instance Data)和对齐填充(Padding)。
jvm对象创建流程与内存分配机制_第2张图片
对象头分为Mark Word、Klass Word。
Mark Word:

你可能感兴趣的:(java,java,jvm)