integer修改缓存大小

在 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 → 输入上述参数。

二、注意事项

  1. 仅对 valueOf () 生效new Integer(n) 会绕过缓存,直接创建新对象,即使 n 在缓存范围内;
  2. 性能权衡:缓存上限设置过大(比如 10000)会占用更多内存,需根据实际需求调整(比如业务中频繁使用 0-200 的整数,可设为 200);
  3. 兼容性:该参数是 Java 官方认可的,所有主流 JDK(Oracle JDK、OpenJDK)都支持。

总结

  1. Integer 缓存默认范围是 [-128, 127],可通过 JVM 参数 java.lang.Integer.IntegerCache.high 修改上限(下限固定);
  2. 调整参数的方式是启动程序时添加 -Djava.lang.Integer.IntegerCache.high=自定义值
  3. 缓存仅对 Integer.valueOf() 生效,new Integer() 不使用缓存,且缓存上限不宜过大(避免内存浪费)。
相关推荐
敲个大西瓜1 天前
Redis一百道核心面试题
数据库·redis·缓存
西门啐血1 天前
Vue 缓存之坑,变量赋值方式和响应式数据
前端·vue.js·缓存
福大大架构师每日一题1 天前
redis 8.8.1安全更新:一类精心构造的 RESTORE 载荷可触发越界写入,RDB 加载链路全面加固
数据库·redis·缓存
難釋懷2 天前
Nginx外置缓存-nginx + memcached
nginx·缓存·memcached
llwszx2 天前
Redis ZSet 完全指南:从应用场景到核心原理
数据库·redis·缓存·跳表·哈希表·zset
難釋懷2 天前
Nginx外置缓存-nginx + redis
redis·nginx·缓存
踏着七彩祥云的小丑2 天前
忘记Redis是否安装过时查看
数据库·redis·缓存
麻瓜code3 天前
【Redis 】数据类型、持久化与过期删除
数据库·redis·缓存
changshuaihua0013 天前
Redis 详解:Redis 与 MySQL 的区别、数据类型与缓存三大问题
数据库·redis·缓存
love530love3 天前
Windows 原生编译 SGLang(4/8):环境关——VS 版本、venv 顺序、CUDA 多版本、生成器缓存
windows·缓存·sglang