java基本数据类型内存占用固定且由jvm规范强制规定:byte/boolean占1字节、short/char占2字节、int/float占4字节、long/double占8字节;存储位置取决于声明方式——局部变量在栈帧、成员变量在堆中对象内、静态变量在元空间、数组元素连续存于堆上数组对象内部。

Java 中基本数据类型不是“统一存在某处”,而是值直接写入内存,位置由声明方式决定:局部变量存栈帧里,成员变量随对象在堆中,静态变量在元空间(原方法区),数组元素则紧挨着存于堆上的数组对象内部。
每种类型占多少字节,是固定的
JVM 规范强制规定了八种基本类型的大小,与操作系统或 CPU 位数无关:
- byte、boolean:各占 1 字节(HotSpot 实现中 boolean 实际按 1 字节对齐存储)
- short、char:各占 2 字节(char 是无符号 16 位 Unicode 码点)
- int、float:各占 4 字节(int 用补码,float 遵循 IEEE 754 单精度)
- long、double:各占 8 字节(long 补码,double 是 IEEE 754 双精度)
存在哪儿?看它怎么声明
基本类型本身没有“天生归属”,关键看上下文:
- 方法内定义的 int count = 0; → 值 0 直接写入当前线程栈帧的局部变量表,方法结束即释放
- 类里的 private long id; → 该字段作为对象实例数据的一部分,随对象一起分配在堆中
- 静态字段 static short VERSION; → 存在元空间(JDK 8+),随类加载而存在,全局共享
- 数组 int[] arr = new int[100]; → 数组对象在堆上,100 个 int 值连续存放,共占 400 字节 + 对象头等开销
和包装类比,差别很大
用 Integer 替代 int 看似方便,但内存代价明显:
- int x = 100; → 栈中仅占 4 字节原始值
- Integer y = 100; → 堆中创建对象,至少含 12 字节对象头 + 4 字节 value 字段 + 4 字节对齐填充 = 20~24 字节
-
ArrayList
底层是 Object[],每个元素额外承载引用和对象开销,内存用量远超 int[]
几个容易忽略的细节
实际布局受 JVM 内存对齐和字段顺序影响:
- 空对象 new Object() 占 16 字节(12 字节头 + 4 字节填充,满足 8 字节对齐)
- 类含 byte b; 和 long l;,若 b 在前,JVM 会在其后填充 7 字节再放 l,总大小可能达 24 或 28 字节
- 局部变量之间不强制对齐,但栈帧整体仍需按平台要求对齐(如 x86_64 通常为 16 字节)
- 基本类型没有 null,未初始化的成员变量有默认值(0 / false / '\u0000'),局部变量则必须显式赋值才能使用
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











