一、Java基础类型

名字默认值占用空间最大值最小值
byte08位127(2^7-1)-128(-2^7)
chat‘u0000’16 位 Unicode 字符\uffff (65535)\u0000 (0)
booleanfalse1位--
short016位32767(2^15 - 1)-32768(-2^15)
int032 位2,147,483,647(2^31 - 1)-2,147,483,648(-2^31)
float0.0f32位--
long0L64 位9,223,372,036,854,775,807(2^63 -1)-9,223,372,036,854,775,808(-2^63)
double0.0d64位--
Stringnull---

占用空间: 位/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.

五、参考