现在的位置: 首页 > 综合 > 正文

HotSpot 对象在内存中的结构

2018年04月19日 ⁄ 综合 ⁄ 共 922字 ⁄ 字号 评论关闭

笔记:本文主要讲述了对象在 hotspot jvm 堆中的结构,数组和普通对象两类对象在 jvm 堆中的结构。

今天看到一个不错的PPT:Build
Memory-efficient Java Applications
,开篇便提出了一个问题,在Hotspot JVM中,32位机器下,Integer对象的大小是int的几倍?

我们都知道在Java语言规范已经规定了int的大小是4个字节,那么Integer对象的大小是多少呢?要知道一个对象的大小,那么必须需要知道对象在虚拟机中的结构是怎样的,来看看Hotspot中对象在内存中的结构:

对象结构

从上面的这张图里面可以看出,对象在内存中的结构主要包含以下几个部分:

  • Mark Word:对象的Mark Word部分占4个字节,其内容是一系列的标记位,比如轻量级锁的标记位,偏向锁标记位等等。
  • Class对象指针:Class对象指针的大小也是4个字节,其指向的位置是对象对应的Class对象(其对应的元数据对象)的内存地址
  • 对象实际数据:这里面包括了对象的所有成员变量,其大小由各个成员变量的大小决定,比如:byte和boolean是1个字节,short和char是2个字节,int和float是4个字节,long和double是8个字节,reference是4个字节
  • 对齐:最后一部分是对齐填充的字节,按8个字节填充。

根据上面的图,那么我们可以得出Integer的对象的结构如下:

Integer内存结构地址

Integer只有一个int类型的成员变量value(查看Integer源码可以发现虽然Integer类可不止1个成员字段,可是其他的都是静态成员变量),所以其对象实际数据部分的大小是4个字节,然后再在后面填充4个字节达到8字节的对齐,所以可以得出Integer对象的大小是16个字节。

因此,我们可以得出Integer对象的大小是原生的int类型的4倍

关于对象的内存结构,需要注意数组的内存结构和普通对象的内存结构稍微不同,因为数据有一个长度length字段,所以在对象头后面还多了一个int类型的length字段,占4个字节,接下来才是数组中的数据,如下图:

数组对象内存结构

关于对象内存布局更多的内容,可以看这篇文章:Java Objects Memory Structure

抱歉!评论已关闭.