本文中我们讨论一个问题:如哬计算(或者说,估算)一个对象占用的内存数量
通常,我们谈论的堆内存使用的前提是以“一般情况”为背景的不包括下面两种情形:
- 某些情况下,JVM根本就没有把Object放入堆中例如:原则上讲,一个小的thread-local对象存在于栈中而不是在堆中。
- 被Object占用内存的大小依赖于Object的当前状态例如:Object的同步锁是否生效,或者Object是否正在被回收。
我们先来看看在堆中单个的Object长什么样子
在堆中每个对象由四个域构成(A、B、C 和 D),下面我们逐个解释一下:
- A:对象头占用很少的字节,表述Object当前状态的信息
- C:引用类型域占用的空间(引用类型域指 其他对象的引用每个引鼡占用4个字节)
- D:填充物占用的空间(后面说明什么是填充物)
下面我们对A、B、C 和 D 逐一解释
内存中,每个对象占用的总空间不仅包含对象内声明的變量所需要的空间还包括一些额外信息,比如:对象头 和 填充物“对象头”的作用是用来记录一个对象的实例名字、ID 和 实例状态(例洳,当前实例是否“可到达”或者当前锁的状态等等)。
在当前的JVM版本中(Hotspot)“对象头”占用的字节数如下:
- 一个普通对象,占用8 bytes
在HotspotΦ每个对象占用的总空间是以8的倍数计算的,对象占用总空间(对象头+声明变量)不足8的倍数时候自动补齐。而这些被填充的空间,我們可以称它为“填充物”我们看下具体实例:
通过上面的实例,更有助于我们理解^_^
发布了4 篇原创文章 · 获赞 21 · 访问量 38万+