JVM篇--详解对象创建过程-对象结构-对象访问方式

hello,hello,刚学过的东西瞬间忘记,是我年龄大了还是年龄大了,可我明明才20出头啊(凑不要脸),其实25了,偏题了....今天整理一下关于JVM对象篇的结构,会记录对象创建过程,还有对象的内存结构以及对象访问定位方式,让自己再复习一遍。

1.你真的了解对象么?

1.1 对象创建过程?

你的对象是怎么来的呢?

对象创建的流程步骤图-自己学习的资料图

对象创建的流程步骤图-网图

文字叙述一下:

1.虚拟机遇到一条new指令时,首先检查这个对应的类是否在常量池中定位到一个类的符号引用。

2.判断这个类是否被加载,进行解析和初始化。

3.为这个新生对象在java堆中分配内存空间。

4.将分配到的内存空间都初始化为零值。

5.设置对象头相关信息,包括GC分代年龄,对象的哈希码hashCode,元数据信息。

6.执行对象init方法。

其中第3条,java堆分配内空间的方式就有两种:

1.1.2 java对象分配内存方式

1.指针碰撞

把堆内存分为两个空间,一个空闲内存,一个使用内存,中间的指针就是分界线,其实分配的内存就是指针移动的过程,当创建对象时,肯定会占用内存空间,那么使用内存增大,指针就会往左移动,空闲内存就会缩小,指针就会向左移动,这种方式就是指针碰撞

图解-网图

图解--学习资料图

2.空闲列表

当java堆内存是不规整的,已使用的内存和空闲内存交错,虚拟机就需要维护一个列表,记录上哪些内存块是可以使用的,在分配内存的时候从列表找出一块足够大的空间划分给对象实例,分配了以后就将这块内存从表里面删掉,这样的方式就叫空闲列表。

空闲列表-图解

总结:指针碰撞分配内存包括开辟内存和移动指针两个部分,空闲列表是开辟一块内存和修改空闲列表两个部分,两者都会出现非原子步骤可能出现并发问题,java虚拟机采用CAS配上失败重试的方式保证更新操作的原子性

到这里你会不会产生疑问,那么java分配内存什么场景下应用指针碰撞什么场景下空闲列表呢?还是两者都有呢?

然后我就带着这个问题搜索答案了,Java堆是否规整由采用的垃圾收集器是否带有压缩整理功能决定,使用Serial、ParNew等带Compact过程的收集器时,Java堆中内存是规整的,CMS这种基于Mark-Sweep算法的收集器时,Java堆中内存是不规整的。

new这么多次对象,你这道它们的结构吗?

1.2 java对象结构

java对象内存有三个:

1.对象头:用于存储对象的元数据信息,

  • 对象头还包括.自身运行时数据(Mark Word)Mark Word部分数据的长度在32位和64位虚拟机(未开启压缩指针)中分别为32bit和64bit,存储对象自身的运行时数据如哈希值等,Mark Word一般被设计为非固定的数据结构,以便存储更多的数据信息和复用自己的存储空间。
  • 类型指针:指向它的类元数据的指针,用于判断对象属于类的实例。

2.实例数据(InstanceData):实例数据存储真正有效的数据,如各种字段内容,各字段的分配策略为longs/doubles、ints、shors/chars、bytes/boolean、oops,相同宽度的字段总是被分配到一起,便于之后取数据,父类定义的变量会出现在子类定义的变量的起前面。

3.对齐填充(Padding):对齐填充部分仅仅起到占位符的作用,为什么要占位符?主要是因为虚拟机自动内存管理系统要求对象启始地址必须是8个字节的整数倍,而对象头部分正好是8给字节的整数倍,因此对象数据示例部分没有对其启始,那么就需要Padding来填充。

你是怎么访问你的对象的?

1.3 java对象定位访问方式

当我们在堆上创建了一个对象实例后,就要通过虚拟机栈中的reference类型数据来操作堆上的对象。现在主流的访问方式就两种(HotSpoot虚拟机采用的是直接指针访问)

1.使用句柄访问对象:java堆中就会划分一块内存来作为句柄池,reference中存储的就是对象的句柄地址,而句柄中包含了对象实例数据和对象类型数据各自的具体地址信息。

句柄池图解-网图:

句柄池图解-资料学习图:

2.直接指针:reference中存储的就是对象地址。

 直接指针-网图

直接指针-自己学习图 

对比:

垃圾回收分析:reference中存储的是稳定的句柄地址,在对象被移动(垃圾收集时移动对象是非常普遍的行为)时只会改变句柄中的实例数据指针,而reference本身不需要被修改;直接指针方式垃圾回收时需要修改reference中存储的地址。

访问效率分析:直接指针优于句柄方式,因为直接指针只进行了一次指针定位,节省了时间开销,而这也是HotSpoot采用方式。

 在最后用图解释一下实例数据类型数据

以上就是全部内容,希望帮助想要改变努力上进的你!

猜你喜欢

转载自blog.csdn.net/dfBeautifulLive/article/details/104693433