基本类型直接存值、内存紧凑,包装类型是对象、含对象头等额外开销;局部变量基本类型在栈占固定字节(如int为4字节),包装类型对象在堆中约24字节(如Integer),且成员变量场景下引用+对象合计开销更大。

回答内存差异要抓住两点:存储位置和实际开销。基本类型直接存值,包装类是对象,带额外结构。
存储位置不同
基本类型变量本身存的是数值:
- 局部变量(如方法内定义的int i = 5)在栈中直接分配4字节空间,值就放在那里
- 成员变量(如int count在类里)随对象一起存在堆中,但仍是紧凑的4字节字段,不带任何对象头
包装类对象一定在堆中创建:
- Integer obj = new Integer(5) 或自动装箱生成的Integer i = 5,都会在堆上分配一个完整对象
- 这个对象包含对象头(约12字节)、实例数据(4字节的int值)、对齐填充(凑整到8字节倍数),HotSpot 64位JVM下通常占24字节
内存占用差距明显
以int和Integer为例:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
立即学习“Java免费学习笔记(深入)”;
- int:固定4字节,无额外信息
- Integer:对象头(Mark Word + Class Pointer,共12字节)+ 实际int值(4字节)+ 填充(至少4字节对齐)= 至少20字节,常见为24字节
- 也就是说,用Integer存一个整数,内存开销是int的6倍左右
缓存机制影响实际表现
虽然Integer对象默认占24字节,但JVM对-128~127范围做了缓存:
- Integer a = 100; 和 Integer b = 100; 指向同一个缓存对象,不会重复分配内存
- 但Integer c = 200; 和 Integer d = 200; 就是两个独立对象,各自24字节
- 所以内存差异不是静态数字,还取决于取值范围和是否命中缓存
成员变量场景更易被忽略
很多人只关注局部变量,其实类字段更关键:
- 声明private int id;:该字段就是4字节,嵌入对象体内
- 声明private Integer id;:字段本身是引用(8字节指针),指向堆中另一个24字节对象,合计至少32字节
- 如果一个类有10个Integer字段,仅这部分就比用int多占近200字节

















