一、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.
评论