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

原创 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虚拟机对象内存布局和访问定位-《深入理解JAVA虚拟机》读书笔记

深入理解java虚拟机做的一些总结笔记

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

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

深入理解JVM02--深入理解对象的创建、内存布局、访问定位

对象的创建   Java是一门面向对象的编程语言,Java程序运行过程中无时无刻都有对象被创建出来。在语言层面上,创建对象通常(例外:克隆、反序列化)仅仅是一个new关键字而已,而在虚拟机中,对象(本...

jvm读书笔记-2.3内存对象的创建、布局和访问

一背景介绍 本文属于深入理解java虚拟机读书笔记系列(周志明)。第二章java内存区域与内存溢出异常。主要分为三节介绍:运行时数据区域,参见之前的整理(运行时数据区)Hotspot虚拟机对象(本文...

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

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

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

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

JVM对象的内存布局和访问

对象在内存中的布局可以分为3块区域:对象头(Header)、实例数据(Instance data)和对齐填充(Padding)。对象头 对象运行时数据 HashCode GC分代年龄 锁状态标志 线...

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

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

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

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

(转)C++_对象的内存布局

  • 2011-05-05 15:43
  • 302KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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