JVM对象创建过程

1 类加载检查
  • jvm通过new指令开始创建对象
  • jvm执行new指令时首先通过指令参数从常量池取到需要创建
  • 检查是否加载解析初始化
  • 如果没有执行加载过程
  • new指令对应java语言具体操作
    • new 关键字创建对象
    • 对象克隆
    • 对象序列化
2 分配内存

加载接下来需要jvm对象分配内存有四个问题需要确定

  • 从哪里划分内存
  • 分配多大的内存?
  • 如何划分内存
  • 划分内存并发问题如何解决

从哪里分配内存?

  • 一般直接新生代伊甸分配内存
  • 如果伊甸无法所剩区域存放对象并且满足大对象设置老年内存
  • 如果通过逃逸分析满足栈上分配要求直接在虚拟机栈分配内存

分配多大的内存?

加载完成多少个属性以及每个属性什么类型的数据已经确认,便可以计算对象所需内存

如何划分内存?

  • 划分内存通常有两种方式,指针碰撞和空闲列表
  • 指针碰撞:堆内存绝对规整所有使用内存放在一边空闲内存放在另一边,有一个指针指向分界线分配内存方式仅仅是指向分界线指针移动对象大小相等距离

  • 空闲列表内存不是规整已使用内存空闲内存相互交错那么就需要额外开辟一块内存记录哪些内存可用分配时候列表找出足够大的空间划分对象

如何解决内存分配时的并发问题?

  • CAS采用CAS+失败重试机制保证更新操作原子性来对分配内存空间动作进行同步处理
  • TLABThread Local Allocation Buffer,提前每个线程划分自己私有空间(也是从伊甸区分配),通过参数-XX:+UseTLAB开启(默认开启)-XX:TLABSize指定分配空间大小

3 初始化
  • 内存分配完成后由于分配内存可能使用的;
  • jvm垃圾回收阶段只是标记垃圾对象从而确定哪些内存可以释放使用;
  • 使用需要分配内存空间初始为零
  • 如果使用的TLAB分配空间这一过程可以提前分配TLAB内存
4 设置对象头
  • 初始化jvm需要对象信息进行设置
  • Klass Pointer指针设置
  • Mark Work初始化
5 执行init()方法

执行init()方法执行构造方法编译阶段jvm每一个构造方法生成对应init()方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值