p49
在HptSpot虚拟机中,对象在内存中存储的布局可以分为三个区域,对象头,实例数据和对齐填充。
对象头:包含两部分信息,第一部分用于存储对象自身的运行时数据,例如哈希码,GC分代年龄,锁状态标识,线程所持有的锁等,这部分的数据的长度在32位和64位的虚拟机中分别为32位和64位,官方称其为“Mark Word”。
对象头的另一部分是类型指针,即对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象时哪个类的实例。
另外,如果对象时一个Java数组,那么在对象头中还必须有一块用于记录数组长度的数据,因为虚拟机可以通过普通Java对象的元数据信息确定Java对象的大小,但是从数组的元数据信息却无法确定数组的大小。
接下来的实例数据部分是对象真正存储的有效信息,也就是在程序代码中定义的各种类型的字段内容。从分配策略可以看出,相同宽度的字段总是被分配到一起,在满足这个前提的条件下,在父类中定义的变量会出现在子类之前。
第三部分对齐填充不是必然存在的,仅仅是占位符的作用。这是因为虚拟机要求对象起始地址必需是8字节的整数倍。
对象的访问定位
建立对象是为了使用对象。我们的Java程序通过栈上的reference数据来操作堆上的具体对象。在虚拟机规范中,reference类型中只规定了一个指向对象的引用,并没有定义这个引用使用什么方式去定位,访问堆中的对象的具体位置。目前的主流的访问方式有使用句柄和直接指针两种。
如果使用句柄的话,那么Java堆中会划分出一块内存来作为句柄池,reference中存储的就是对象的句柄地址,而句柄中包含了对象实例数据与类型数据各自的具体地址信息。
如果使用直接指针访问,那么Java堆对象的布局中就必须考虑如何放置访问类型数据的相关信息,而reference中存储的直接就是对象地址。
使用句柄访问的最大好处就是,reference中存储的是稳定的句柄信息,在对象被移动时,只会改变句柄中的实例数据指针,而reference本身不需要修改。
使用直接指针访问的最大好处是,速度更快。
分享到:
相关推荐
C++对象内存布局[归类].pdf
涉及各种情况下C++对象的sizeof大小,包括单一类对象,继承,重复继承 多继承 单一虚继承 等各种情况下的对象大小。对C++对象内存布局有清楚了解。
jvm jvm内存布局
vc++类对象内存布局.jpg通过图解让你更容易理解哦呵呵....
Java对象内存布局(对象头信息锁升级)示例
介绍C++对象在内存中是怎样分布的,有助于深层学习C++。
这是一些关于基类含有virtual函数或子类是virtual继承的对象的内存布局。其中有我截的一些图、内存布局图、文字说明,不过能力有限,说的不是很清楚,望谅解
安卓逆向学习笔记之ART中的C++对象内存布局及获取art-method和dex-file对象.docx
c++ 标准不规定 c++ 实现的时候的对象的具体的内存布局,除了在某些方面有小的限制以外,c++ 对象在内存里面的布局完全是由编译器自行决定,这里只是讨论 vc++ .net 2003 build 7.1.3091 的实现方式.
详细理解vs2008C++编程内存使用情况!!值得一看...
本人查阅资料,以ppt的形式描述了iOS开发过程中可能困扰程序员的内存管理和对象复制等常见问题,以及iOS开发环境的升级带来的变化情况。 适合有入门基础的程序开发人员参考。
C++ 对象的内存布局。全面分析C++ 对象的内存布局。
1)有成员变量的情况。 2)有重复继承的情况。 3)有虚拟继承的情况。 4)有钻石型虚拟继承的情况。
c++对象的内存布局 对c++做了非常通俗 而且经典的分析 如果你想对c++的工作方式有更深入的了解 这是一份非常有帮助的文档
介绍了heap dump和thread dump,以及详细介绍dump工具Memory Analyzer的使用,最后讲解了Java对象的内存布局。
C++ 对象的内存布局(下)1
主要讲述了c++对象内存布局情况!
C++对象的内存布局[归纳].pdf
博客《Cpp 对象模型探索 —— 含有虚基类的类的内存布局》的图片原文档,网址:https://blog.csdn.net/itworld123/article/details/102890062。
C++对象模型在内存中的实现,讲述了类,继承以及虚继承的内存布局;成员变量和成员函数的访问已经访问时的开销情况,包含虚函数的情况,考察构造函数,析构函数,以及特殊的赋值操作符成员函数是如何工作的,数组是...