java虚拟机(四)对象的创建

这是我参与11月更文挑战的第16天,活动详情查看:2021最后一次更文挑战

前言

在此之前我们已经讲完了运行时数据区的内容,现在我们来讲第四部分,这部分是关于new对象的。

image.png

对象的组成

image.png

java对象的组成有对象头,实例数据以及对其填充,在对象投中分为两个部分一个是mark word,一部分是class pointer 两部分组成,每一个各占四字节。在mark word中又被分为以下几个部分,第一个对象哈希码,第二个对象分代年龄,第三个锁标志,第四个GC标记。此处GC标记在Hot sport虚拟机中也就是常用的虚拟机中,GC标记为三色标记也就是黑色、白色、灰色三种标记。

具体颜色标记代表的含义我们在GC篇章中了解。

对象的访问

Object a = new Object(); 这里的a在new 的时候其实是在java栈的本地变量表中放入参数,也就是java虚拟机栈。这里强调一个点,大多数程序员认为对象是创建在堆中的,其实不是很准确,对象其实在创建时是会去栈中尝试新建对象,这时候会有个逃逸分析,具体的逃逸分析大家可以百度一下,这个我后面也会专门开一个篇章来讲,这里的逃逸分析大家先理解为判断是否有栈外对象引用该对象,如果引用了那么对象的创建就回去堆中创建,然后在堆中先进行半初始化,在执行到构造方法指令时才会去对堆中对象进行赋值。

这里的半初始化给大家解释一下,这是java虚拟机的保护机制,为了防止对象没有足够的内存空间所做的提前分配空间。

总结

  1. java对象的初始化其实是半初始化,他并没有在开辟空间时就初始化,而是等到构造方法指令才初始化
  2. mark word 占8字节,一般对象new一定要可以被8整除,这是为了方便java虚拟机的装载与拆卸

猜你喜欢

转载自juejin.im/post/7031929553375199263
今日推荐