integer缓存默认范围是-128到127,下限-128硬编码不可改,上限127可通过-xx:autoboxcachemax=n或-djava.lang.integer.integercache.high=n调高,仅影响valueof和自动装箱,对new integer无效。

Java 中的 Integer 缓存机制默认缓存了 -128 到 127 范围内的整数对象,这是由 IntegerCache 类实现的。JVM 提供了 -XX:AutoBoxCacheMax=N 参数,用于**扩大这个缓存区的上限(即最大值)**,但注意:它**不能改变下限(最小值始终为 -128)**,也不能禁用缓存。
参数作用与生效条件
该参数仅影响 Integer.valueOf(int) 方法在自动装箱或显式调用时的行为,且只对大于等于 -128、小于等于指定最大值的整数生效。例如:
- 设置
-XX:AutoBoxCacheMax=200后,Integer.valueOf(150)返回缓存对象,而Integer.valueOf(250)仍新建对象; - 该参数在 JVM 启动时解析,运行时不可修改;
- 仅对
Integer有效,Long、Short等有各自独立的类似参数(如-XX:AutoBoxCacheMax对Long无效,需用-XX:LongCacheMax); - 必须配合
-XX:+UseCompressedOops(默认开启)才能生效(JDK 7u40+ 起,该限制已放宽,但旧版本可能依赖此选项)。
正确使用方式
在启动 Java 应用时,将参数加在 java 命令中,放在类名之前:
java -XX:AutoBoxCacheMax=500 MyApplication
验证是否生效,可通过反射检查缓存数组长度(仅用于调试,不建议生产使用):
Field cacheField = Integer.class.getDeclaredField("cache");
cacheField.setAccessible(true);
Integer[] cache = (Integer[]) cacheField.get(null);
System.out.println("Cache length: " + cache.length); // = max - (-128) + 1
若设为 500,则缓存数组长度应为 500 - (-128) + 1 = 629。
注意事项与常见误区
不会影响 new Integer(int):该构造器总是创建新对象,与缓存无关;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
比较时仍需用 equals():即使两个值都在缓存范围内,用 == 比较仅在同为缓存对象时才可靠,跨范围或混用 new 会导致意外结果;
并非所有 JDK 版本都支持:JDK 6u20+ 引入,JDK 7 及以后稳定支持;JDK 9+ 保留但文档中标记为“experimental”,实际仍可用;
内存开销随值增大而增加:缓存 1000 个 Integer 对象比默认多占用约几 KB 内存,通常可忽略,但设为极大值(如 100000)会浪费堆空间。
替代方案与建议
如果只是想复用特定整数对象,更可控的方式是自行维护静态缓存池;
若为性能优化目的,优先确保业务逻辑中高频使用的整数落在默认缓存范围内(-128~127),避免盲目调大;
在微服务或容器化环境中,注意统一 JVM 参数配置,防止因缓存行为差异导致难以复现的 bug。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










