一、Java基础类型

名字 默认值 占用空间 最大值 最小值
byte 0 8位 127(2^7-1) -128(-2^7)
chat ‘u0000’ 16 位 Unicode 字符 \uffff (65535) \u0000 (0)
boolean false 1位 - -
short 0 16位 32767(2^15 - 1) -32768(-2^15)
int 0 32 位 2,147,483,647(2^31 - 1) -2,147,483,648(-2^31)
float 0.0f 32位 - -
long 0L 64 位 9,223,372,036,854,775,807(2^63 -1) -9,223,372,036,854,775,808(-2^63)
double 0.0d 64位 - -
String null - - -

占用空间: 位/8=字节

二、其他类型

1. 引用类型

引用类型 占用空间
32位 4 bytes
64位 8 bytes

2. 数组对象

64位机器 24bytes

java虚拟机规定中,在方法区中所占用的内存大小与在栈帧所占用的内存大小不同,因为在方法区中占用内存以字节为最小单位,但是在战帧中以字为最小单位。如byte类型在方法区中它占用8位,为一个字节,但是在栈帧中以一个字,即32位来处理,其实就是当作一个int类型来处理

三、对象头

操作系统 占用空间
32位 8 bytes
64位 16 bytes

四、计算

1.(对象头 + 实例数据 + padding) % 8等于0且0 <= padding < 8

2.以64位数据计算

1    class User{
2        int a;
3    }
  • 对象头大小: 16
  • 属性的大小: 4

根据对齐填充规则, (16 + 4 + padding)%8 = 0 && padding <8 得出: padding为4

3.虚拟支持指针压缩,会对对象头的大小影响,最终会小于等于24.

五、参考