如何计算Java对象大小呢?
Tips.先了解,Java基本数据的大小
类型名称 | 关键字 | 占用内存 | 取值范围 |
---|
字节型 | byte | 1字节 | -128~127 |
短整型 | short | 2字节 | -32768~32767 |
整型 | int | 4字节 | -2147483648~2147483647 |
长整型 | long | 8字节 | -9223372036854775808L~9223372036854775807L |
单精度浮点类型 | float | 4字节 | +/-3.4E+38F(6~7 个有效位) |
双精度浮点类型 | double | 8字节 | +/-1.8E+308 (15 个有效位) |
布尔值 | boolean | 1字节 | true或false |
字符串型 | char | 1字节 | ISO单一字符集 |
引用类型 | object | 4字节 | 当对象字段不是基本数据类型 |
- 包转类=对象,是引用类型,默认开启指针压缩4字节,不开启(-XX:-UseCompressedOops)8字节
- 一个汉字占用3个字节
- 1字节=8位 A (ASCII:0100 0001)
对象内存划分(64位虚拟机)
内存名称 | 占用字节 |
---|
对象头 | Mark World(8字节),类型指针(4或8字节),数组长度(数组对象则有) |
实例数据 | 根据对象的字段类型计算大小 |
对齐填充 | 最后算的必须是8的倍数,不足则进行填充 |
@Data
public class User {
private String name;
private Integer age;
}
import com.example.demo.desgin.mode.even.source.User;
import lombok.SneakyThrows;
import org.openjdk.jol.info.ClassLayout;
import org.openjdk.jol.vm.VM;
public class CASTest {
@SneakyThrows
public static void main(String[] args) {
System.out.println(VM.current().details());
User user = new User();
user.setAge(123);
user.setName("mike");
System.out.println(ClassLayout.parseInstance(user).toPrintable());
}
}
- 注意:jvm默认开启指针压缩,结果就是类型指针由8字节压缩成4字节
- 根据公式:对象大小=对象头+实例数据+对象填充
- 对象头:Mark World 8字节,类型指针 4字节,数组长度 0字节
- 实例数据:字段name=mike, string底层是char基本类型 4字节;字段age=123 基本数据类型int 4字节
- 对齐填充:8 + 4 + 4 + 4 = 20,不是8倍数,需要填充4个字节=24
- 结论就是:24字节
- 结果