在HotSpot虚拟机里,对象在堆内存中的存储布局可以划分为三个部分:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding

对象头(Header

HotSpot虚拟机对象的对象头部分包括两类信息。(“Mark Word”、类型指针)

第一类是用于存储对象自身的运行时数据,如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等,这部分数据的长度在32位和64位的虚拟机(未开启压缩指针)中分别为32个比特和64个比特,官方称它为“Mark Word”。Mark Word被设计成一个有着动态定义的数据结构,以便在极小的空间内存储尽量多的数据,根据对象的状态复用自己的存储空间。

另外一部分是类型指针,即对象指向它的类型元数据的指针,Java虚拟机通过这个指针来确定该对象是哪个类的实例。(并不是所有的虚拟机实现都必须在对象数据上保留类型指针)

(如果对象是一个Java数组,那在对象头中还必须有一块用于记录数组长度的数据,因为虚拟机可以通过普通Java对象的元数据信息确定Java对象的大小,但是如果数组的长度是不确定的,将无法通过元数据中的信息推断出数组的大小)

实例数据(Instance Data

实例数据部分是对象真正存储的有效信息,即我们在程序代码里面所定义的各种类型的字段内容。(这部分的存储顺序会受到虚拟机分配策略参数(-XX:FieldsAllocationStyle参数)和字段在Java源码中定义顺序的影响。HotSpot虚拟机默认的分配顺序为longs/doubles、ints、shorts/chars、bytes/booleans、oops(Ordinary

Object Pointers,OOPs),从以上默认的分配策略中可以看到,相同宽度的字段总是被分配到一起存放,在满足这个前提条件的情况下,在父类中定义的变量会出现在子类之前。如果HotSpot虚拟机的+XX:CompactFields参数值为true(默认就为true),那子类之中较窄的变量也允许插入父类变量的空隙之中,以节省出一点点空间。)

对齐填充(Padding

不是必然存在的,也没有特别的含义,它仅仅起着占位符的作用。由于HotSpot虚拟机的自动内存管理系统要求对象起始地址必须是8字节的整数倍,换句话说就是任何对象的大小都必须是8字节的整数倍对象头部分已经被精心设计成正好是8字节的倍数(1倍或2倍),因此,如果对象实例数据部分没有对齐的话,就需要通过对齐填充来补全

Java虚拟机对象的探索—对象的内存布局相关推荐

  1. Java虚拟机学习(5):内存调优

    JVM调优主要是针对内存管理方面的调优,包括控制各个代的大小,GC策略.由于GC开始垃圾回收时会挂起应用线程,严重影响了性能,调优的目是为了尽量降低GC所导致的应用线程暂停时间. 减少Full GC次 ...

  2. 7. 重磅硬核 | 一文聊透对象在JVM中的内存布局,以及内存对齐和压缩指针的原理及应用

    重磅硬核 | 一文聊透对象在JVM中的内存布局,以及内存对齐和压缩指针的原理及应用 大家好,我是bin,又到了每周我们见面的时刻了,我的公众号在1月10号那天发布了第一篇文章?<从内核角度看IO ...

  3. 一文聊透对象在JVM中的内存布局,以及内存对齐和压缩指针的原理及应用

    大家好,我是bin,又到了每周我们见面的时刻了,我在1月10号那天发布了第一篇文章<从内核角度看IO模型的演变>,在这篇文章中我们通过图解的方式以一个C10k的问题为主线,从内核角度详细阐 ...

  4. Java虚拟机(二)对象的创建与OOP-Klass模型

    相关文章  Java虚拟机系列 前言 在前一篇文章中我们学习了Java虚拟机的结构原理与运行时数据区域,那么我们大概知道了Java虚拟机的内存的概况,那么内存中的数据是如何创建和访问的呢?这篇文章会给 ...

  5. 深入理解Java虚拟机(三)——对象已死吗

    垃圾收集器(对象回收条件,四大引用,对象的自我拯救) 概述 前面我l们了解到了Java内存运行时区域的各个部分,其中程序计数器,虚拟机栈,本地方法栈这三个区域随线程而生,随线程而灭.因此这几个区域的内 ...

  6. Java虚拟机详解(六)------内存分配

    我们说Java是自动进行内存管理的,所谓自动化就是,不需要程序员操心,Java会自动进行内存分配和内存回收这两方面. 前面我们介绍过如何通过垃圾回收器来回收内存,那么本篇博客我们来聊聊如何进行分配内存 ...

  7. Java虚拟机:JVM 主要组成部分与内存区域

    一.JVM 主要组成部分: JVM包含两个子系统和两个组件,分别为: Class loader(类装载子系统):根据给定的全限定名类名来装载class文件到运行时数据区的方法区中 Execution ...

  8. vilatile 深入理解java虚拟机_深入理解Java虚拟机(jvm性能调优+内存模型+虚拟机原理)...

    本套课程从虚拟机的发展历史,虚拟机的内存结构,对象的分配与回收以及字节码,类加载等多个方面深入地对Java虚拟机进行了剖析.内容详实,语言通俗易懂.理论结合实践,让学习本套视频的朋友可以更快的理解虚拟 ...

  9. Java虚拟机-第二篇-GC算法与内存分配策略

    2019独角兽企业重金招聘Python工程师标准>>> GC引入 在Java的运行时数据区中,程序计数器.虚拟机栈.本地方法栈三个区域都是线程私有的,随线程而生,随线程而灭,在方法结 ...

最新文章

  1. 6 js 比较两个数组的差异_每天一道算法题(js)(3)——寻找两个有序数组的中位数...
  2. java web netty_基于Netty的非Servlet规范 JavaWeb框架及高性能 Java服务器
  3. HUD - 4463 Outlets
  4. HDU - 4990 Reading comprehension(矩阵快速幂,水题)
  5. SAP Commerce Cloud启动时遇到的9001端口被占用的问题
  6. MySQL Innodb存储引擎使用B+树做索引的优点
  7. python 内推_[宜配屋]听图阁
  8. Android 功耗(7)---思维导图
  9. 基于JAVA+Servlet+JSP+MYSQL的学籍管理系统
  10. UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0xbd in position 198: illegal multibyte sequence
  11. WebPack基础入门(一):万物皆可webpack
  12. RuntimeError: expected a Variable argument, but got torch.FloatTensor
  13. 网络切片技术缺点_5G中网络切片研究的现状与挑战
  14. 【C语言】计算器实现
  15. 硬件课程设计:步进电机控制系统
  16. ROS操作系统基本命令汇总
  17. 小黄鸡 php,Simsimi (小黄鸡) API接口(PHP)公布,小黄鸡API接口非官方PHP版本来啦...
  18. Qualtrics初体验——10年不融资,价值80亿美金
  19. 【跨境电商平台规则与合规研讨会】在跨境驿站顺利召开
  20. 营销活动·章鱼架构设计

热门文章

  1. 最新巫妖易语言post-js逆向教程
  2. 用ros从realsense中录制并提取rgb图像
  3. 天河新一代,安装OpenCV
  4. dataworks学习--数据开发流程
  5. 五菱4s店维修记录怎么查?
  6. 昆仑太科冲刺科创板:年营收1.3亿拟募资5亿 电科太极持股40%
  7. 学生管理系统(链表+数据库)学习小结
  8. 解决电脑打开软件时会有弹窗的问题
  9. 模拟Chrome皮肤
  10. 关于如何在终端设置有颜色的字体