integer缓存池仅对integer.valueof()或自动装箱且值在-128至127(默认)范围内的对象生效;下限-128硬编码不可改,上限可通过-djava.lang.integer.integercache.high调整,默认127。

Integer 缓存池的生效范围不是“所有 Integer 对象都参与”,而是严格限定在 通过 Integer.valueOf() 或自动装箱(如 Integer a = 100;)创建的对象,且数值落在 -128 到 127(含)之间时才复用缓存对象。超出此范围或使用 new Integer() 构造,则一定新建实例。
缓存真正起作用的三种情况
只有满足以下全部条件,才会命中缓存:
- 调用的是
Integer.valueOf(int)方法(包括编译器自动插入的装箱,例如Integer i = 127;) - 传入的 int 值 ≥ -128 且 ≤ 当前缓存上限(默认 127)
- 该值尚未被 GC 回收(缓存对象在类加载时初始化,长期存活)
为什么下限 -128 不可改、上限却可以调?
这是 JVM 规范与实现权衡的结果:
-
-128 是硬编码在
IntegerCache.low中的,源于 byte 类型最小值,也是语言规范强制要求的最低保障范围,所有 JVM 必须支持 -
上限默认为 127,但可通过 JVM 参数扩大,因为实际缓存数组长度由
IntegerCache.high决定,而该字段在静态块中读取系统属性java.lang.Integer.IntegerCache.high - 注意:设为小于 127 的值(如 100)不会生效,JVM 会自动回退到 127
手动调整缓存上限的操作方式
仅需在启动 JVM 时添加系统属性参数:
- 命令行运行:
java -Djava.lang.Integer.IntegerCache.high=256 YourMainClass - IDEA 配置:Run → Edit Configurations → VM options → 填入
-Djava.lang.Integer.IntegerCache.high=256 - Eclipse 配置:Run → Run Configurations → Arguments → VM arguments → 同上
设置后,Integer.valueOf(200) 就会返回同一个对象(即 a == b 为 true),但 new Integer(200) 和 Integer.valueOf(300) 仍各自新建。
验证缓存是否生效的简单写法
不用依赖日志或调试,一段代码即可确认:
Integer x = Integer.valueOf(200); Integer y = Integer.valueOf(200); System.out.println(x == y); // 设置 high=256 后输出 true;未设置则为 false
关键点:必须用 valueOf(),必须用相同数值,且该数值需落在新设定的范围内。










