HotSpot虚拟机在java堆中对象的分配、布局和访问

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40400960/article/details/82668640

一.对象的创建

二.对象的内存布局(一个对象在内存中是怎样存储的)

在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块区域:对象头、实例数据和对齐填充

HotSpot虚拟机的对象头包括两部分信息:第一部分是用于存储对象自身的运行时数据,如哈希码、GC分代年龄、锁状态标注、线程持有的锁等。另一部分是类型指针,即对象指向它的雷院数据的指针,虚拟机通过这个指针来确定这个对象是那个类的实例

实例数据部分是对象真正存储的有效信息,也是在程序代码中定义的各种类型的字段内容。无论是从父类继承下来的,还是在子类中定义的,都需要记录下来。这部分的存储顺序会受到虚拟机分配策略参数和字段在java源码中定义定义顺序的影响。HotSpot虚拟机默认的分配策略是longs/doubles、ints,shorts/chars,bytes/booleans,oops

第三部分对其填充部分不是必须的,他没有实际意义,仅仅起到内存填充的作用

三.对象的访问定位

java程序需要通过栈上的reference数据来操作堆上的具体对象。目前主流的访问方式有使用句柄和直接指针两种。

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

2.如果使用直接指针访问,那么java堆对象的布局中就必须考虑如何防止访问类型数据的相关信息,而reference中存储的直接就是对象地址。

 对于HotSpot虚拟机而言,它是以第二种方式进行对象访问的。

猜你喜欢

转载自blog.csdn.net/qq_40400960/article/details/82668640