对象的内存布局及访问原理

原创 2017年07月09日 23:19:57

天天面向对象,四处找对象,了解对象先从对象的内存布局及访问原理开始。

对象的内存布局
对象的内存布局如下图所示
这里写图片描述

HotSpot虚拟机的对象头包括两部分信息:运行时数据和类型指针。 如果对象是一个Java数组,那在对象头中还必须有一块用于记录数组长度的数据,虚拟机可以通过普通Java对象的元数据信息确定Java对象的大小,但是从数组的元数据中无法确定数组的大小。

  • 运行时数据(Mark Word)部分数据的长度在32位和64位虚拟机(未开启压缩指针)中分别为32bit和64bit。然后对象需要存储的运行时数据其实已经超过了32位、64位Bitmap结构所能记录的限度,但是对象头信息是与对象自身定义的数据无关的外存储成本,Mark
    Word一般被设计为非固定的数据结构,以便存储更多的数据信息和复用自己的存储空间。
  • 类型指针,即指向它的类元数据的指针,用于判断对象属于哪个类的实例。(并不是所有的虚拟机实现都必须在对象数据上保留类型指针,换句话说,查找对象的元数据并不一定要经过对象本身)
  • 实例数据部分是对象真正存储的有效信息,也是在程序代码中所定义的各种类型的字段内容。无论是从父类中继承下来的,还是在子类中定义的,都需要记录下来。各字段的分配策略为longs/doubles、ints、shorts/chars、bytes/boolean、oops(ordinary
    object pointers),相同宽度的字段总是被分配到一起,便于之后取数据。父类定义的变量会出现在子类前面。
  • 对齐填充部分仅仅起到占位符的作用,并非必须。

对象访问原理
对象访问会涉及到Java栈、Java堆、方法区这三个内存区域。

  • 使用句柄访问对象。即reference中存储的是对象句柄的地址,而句柄中包含了对象示例数据与类型数据的具体地址信息,相当于二级指针。

这里写图片描述

  • 直接指针访问对象。即reference中存储的就是对象地址,相当于一级指针。 这里写图片描述

 这两种访问对象的方式各有优势,使用句柄访问方式最大好处就是reference中存储的是稳定的句柄地址,在对象移动时只需要改变句柄中的实例数据指针,而reference不需要改变。使用指针访问方式最大好处就是速度快,只进行了一次指针定位,节省了时间开销,就虚拟机而言,它使用的是第二种方式(直接指针访问)。

版权声明:本文为博主原创,转载请注明出处(http://blog.csdn.net/jdjh1024).

深入理解java虚拟机(二)HotSpot Java对象创建,内存布局以及访问方式

内存中对象的创建、对象的结构以及访问方式。 一、对象的创建 在语言层面上,对象的创建只不过是一个new关键字而已,那么在虚拟机中又是一个怎样的过程呢? (一)判断类是否加载。虚拟机遇到一条new指...

Java虚拟机(HotSpot)-对象:创建、内存布局、访问定位

《深入理解Java虚拟机》第2版-第二章读书笔记 对象的创建1.检查这个指令的参数是否能在常量池中定位到这个类的符号引用,如果存在即进入22.检测该符号引用代表的类是否已被加载、解析和初始化过,若没有...
  • name_z
  • name_z
  • 2016年10月04日 10:54
  • 304

Java对象的创建、内存布局、访问定位

对象的创建 一个简单的创建对象语句Clazz instance = new Clazz();包含的主要过程包括了类加载检查、对象分配内存、并发处理、内存空间初始化、对象设置、执行ini方法等。 ...

细说JVM系列:JVM对象的创建、内存布局、访问

对象的创建、内存布局、访问  这里会深入探讨HotSpot虚拟机在java堆中的对象分配、布局和访问的全过程。一.对象的创建  虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定...
  • a910626
  • a910626
  • 2016年08月26日 14:43
  • 570

对象的创建,访问,内存布局

对象的创建 当VM遇到一条new的指令时,先查找常量池,看是否能定位到一个符号引用,检查类是否被类加载器加载、解析、初始化(?) 如果不满足检查条件,则进行类加载过程,在过程结束时可以确定需要分配...

对象的内存布局和访问方式

1、对象的内存布局: (1)对象头(对象的设置信息、指向类元数据的指针、数组的长度) (2)实际数据(因虚拟机而异 hotspot:long double,int,short/char,byte/bo...

《深入理解Java虚拟机》学习笔记(二)(Java对象的创建、内存布局和访问定位)

对象对象创建Created with Raphaël 2.1.0Start虚拟机遇到一条new指令指令的参数是否能在常量池中定位到一个类的引用符号?这个符号引用代表的类是否已被加载、解析和初始化过为新...

深入理解java虚拟机 第2章(二):对象创建,内存布局,访问

java对象的创建java对象创建,内存布局,访问定位
  • Scplove
  • Scplove
  • 2016年09月06日 03:26
  • 447

JVM中的对象创建、内存布局和访问定位

探究JVM中的对象创建、对象的内存布局以及对象的访问定位

HotSpot虚拟机对象的创建、内存布局、访问定位

HotSpot虚拟机对象的创建、内存布局、访问定位
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:对象的内存布局及访问原理
举报原因:
原因补充:

(最多只允许输入30个字)