在 Java 中,Integer 类的缓存(也叫享元模式)是为了优化小整数的创建性能,默认缓存范围是 [-128, 127]。你可以通过调整 JVM 参数来修改缓存的上限 (下限 -128 固定不可改),下面我会详细说明具体方法和原理。
一、修改 Integer 缓存大小的方法
1. 核心原理
Integer 的缓存由 IntegerCache 内部类实现,其缓存上限默认是 127,但可以通过 JVM 参数 java.lang.Integer.IntegerCache.high 自定义。注意:
- 下限
-128是硬编码的,无法修改; - 上限只能增大(比如设为 256、500),不能小于 127(否则仍会使用 127);
- 该参数仅对通过
Integer.valueOf()创建的对象生效(new Integer()会直接新建对象,不使用缓存)。
2. 具体操作步骤
(1)运行时指定 JVM 参数
在启动 Java 程序时,添加以下参数调整缓存上限(示例:将上限设为 256):
bash
运行
java -Djava.lang.Integer.IntegerCache.high=256 你的主类名
(2)代码验证缓存是否生效
下面的代码可以验证缓存是否生效(对比不同上限下的对象地址):
java
运行
public class IntegerCacheTest {
public static void main(String[] args) {
// 测试 127(默认缓存)
Integer a = Integer.valueOf(127);
Integer b = Integer.valueOf(127);
System.out.println("127 是否来自缓存:" + (a == b)); // true
// 测试 128(默认不缓存,修改参数后缓存)
Integer c = Integer.valueOf(128);
Integer d = Integer.valueOf(128);
System.out.println("128 是否来自缓存:" + (c == d));
// 默认输出 false,设置 -Djava.lang.Integer.IntegerCache.high=256 后输出 true
}
}
3. 特殊场景:IDE 中配置 JVM 参数
如果你用 IDEA/Eclipse 运行代码,需要在运行配置中添加参数:
- IDEA:Run/Debug Configurations → VM options → 输入
-Djava.lang.Integer.IntegerCache.high=256; - Eclipse:Run → Run Configurations → Arguments → VM arguments → 输入上述参数。
二、注意事项
- 仅对 valueOf () 生效 :
new Integer(n)会绕过缓存,直接创建新对象,即使 n 在缓存范围内; - 性能权衡:缓存上限设置过大(比如 10000)会占用更多内存,需根据实际需求调整(比如业务中频繁使用 0-200 的整数,可设为 200);
- 兼容性:该参数是 Java 官方认可的,所有主流 JDK(Oracle JDK、OpenJDK)都支持。
总结
Integer缓存默认范围是[-128, 127],可通过 JVM 参数java.lang.Integer.IntegerCache.high修改上限(下限固定);- 调整参数的方式是启动程序时添加
-Djava.lang.Integer.IntegerCache.high=自定义值; - 缓存仅对
Integer.valueOf()生效,new Integer()不使用缓存,且缓存上限不宜过大(避免内存浪费)。