jvm中对象的创建过程
Posted byebyebird
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了jvm中对象的创建过程相关的知识,希望对你有一定的参考价值。
虚拟机遇到new指令时:
首先检查方法区中是否加载了类信息,如果没有加载,则先加载类信息
类加载后,为对象分配内存,大小在加载类信息时确定
如果对内存是规整的,即垃圾回收后整理内存碎片合并成一块未使用的区域则分配内存就是将记录内存位置的指针移动相应大小的一段距离(指针碰撞)
如果内存不规整,即垃圾回收后没有整理内存碎片,那么需要维护一个列表,记录内存碎片大小,分配空间时选择可用的一块(空闲列表)
同时分配内存时存在线程安全问题,即分配对象a的内存,指针还没有变化,对象b又用了该指针分配内存,解决这个问题有两种方式
1.CAS(旧值C,期望值A,新值s,当A=C时说明C值没有修改过,然后让C=S 这种方法可能引发ABA问题)+失败重试
2.把内存分配根据不同线程,将堆划分为不同的空间(TLAB 本地线程分配缓冲),哪个线程分配内存,就在哪个线程的TLAB上划分,当TLAB用完,分配新的TLAB时,采用同步方法
对象分配内存后设置头信息(对象头信息后面再做介绍)
头信息设置完成后执行初始化方法,至此对象创建完成
以上是关于jvm中对象的创建过程的主要内容,如果未能解决你的问题,请参考以下文章
JVM技术专题 全流程化分析Java对象的创建过程「 原理篇」