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() 不使用缓存,且缓存上限不宜过大(避免内存浪费)。
相关推荐
LSL666_2 小时前
11 redis核心配置参数
数据库·redis·缓存
ezreal_pan8 小时前
弹窗缓存重构技术方案
缓存·重构·golang
一只大袋鼠8 小时前
Redis 安装+基于短信验证码登录功能的完整实现
java·开发语言·数据库·redis·缓存·学习笔记
Predestination王瀞潞11 小时前
缓存机制:一二级缓存
spring·缓存·mybatis
筱顾大牛11 小时前
什么是缓存?缓存的作用?成本?
缓存
Mr.朱鹏11 小时前
分布式-redis主从复制架构
java·spring boot·redis·分布式·缓存·架构·java-ee
Mr.朱鹏11 小时前
分布式-redis哨兵模式架构
数据库·redis·分布式·spring·缓存·架构·java-ee
Max_uuc11 小时前
【内核心法】撞碎“内存墙”:高性能 C++ 中的缓存友好型设计与数据局部性进化
缓存
rannn_11111 小时前
【Redis|实战篇1】黑马点评|短信登录功能实现
java·redis·后端·缓存·项目