基本类型占用的内存
Java基本类型占用的字节数:(1字节(byte)=8位(bits))
- 1字节: byte , boolean
- 2字节: short , char
- 4字节: int , float
- 8字节: long , double
对象内存的存储方式及所占用内存大小计算
通常,我们谈论的堆内存使用的前提是以“一般情况”为背景的。不包括下面两种情形:
- 某些情况下,JVM根本就没有把Object放入堆中。例如:原则上讲,一个小的thread-local对象存在于栈中,而不是在堆中。
- 被Object占用内存的大小依赖于Object的当前状态。例如:Object的同步锁是否生效,或者,Object是否正在被回收。
我们先来看看在堆中单个的Object长什么样子
在堆中,每个对象由多个域构成,下面我们逐个解释一下:
下面我们对A、B、C 和 D 逐一解释
对象头:“对象头”的作用是用来记录一个对象的实例名字、ID 和 实例状态(例如,当前实例是否“可到达”,或者当前锁的状态等等)。 在当前的JVM版本中(Hotspot),一个普通对象,占用8bytes(64位系统为8bytes)
OOP:Ordinary Object Point,普通对象指针,指向该对象对应类在方法区中的类信息实例。
数组长度:4个字节(bytes)
基本类型
- 1字节: byte , boolean
- 2字节: short , char
- 4字节: int , float
- 8字节: long , double
HotSpot创建的对象的字段会先按照给定顺序排列一下,默认的顺序如下,从长到短排列,引用排最后:
long/double –> int/float –> short/char –> byte/boolean –> Reference
引用类型:每个引用类型占用 4 bytes
填充物:在Hotspot中,每个对象占用的总空间是以8的倍数计算的,对象占用总空间(对象头+声明变量)不足8的倍数时候,自动补齐。而,这些被填充的空间,我们可以称它为“填充物”。我们看下具体实例:
- 一个空对象(没有声明任何变量)占用 16bytes – > 对象头 (8bytes) + OOP(4bytes) + padding(4bytes)
- 只声明了一个boolean类型变量的类,占用 16bytes –> 对象头(8bytes) + OOP(4bytes) + boolean (1bytes) + padding(7bytes)
- 声明了4个boolean类型变量的类,占用 16bytes –> 对象头(8bytes) + OOP(4bytes) + boolean (4bytes)
Compressed oops(压缩了的普通对象指针)
参考:https://www.2cto.com/kf/201611/560958.html