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() 不使用缓存,且缓存上限不宜过大(避免内存浪费)。
相关推荐
像风一样自由20204 小时前
29.Redis在大模型应用中有哪些用途缓存会话与限流
数据库·人工智能·redis·缓存·大模型·milvus·智能体
九皇叔叔13 小时前
【第二章】Redis基础入门:Redis是什么、为什么快以及核心特性详解
数据库·redis·缓存
敲代码的嘎仔1 天前
用 Redis 合并写 + DelayQueue 延迟检测,把视频播放进度写库频率降到 1/60
java·开发语言·数据库·redis·缓存·音视频·高并发
程序猿乐锅1 天前
【黑马点评 | 第一篇】从 Session 到 Redis+Token 的改造与拦截器实现
数据库·redis·缓存
野生技术架构师1 天前
Redis Hot Key 与 Big Key:危害、发现与解决方案
数据库·redis·缓存
零依赖极客1 天前
Day 9·1 KV 也量化——q8 KV 把缓存与 decode 带宽压到一半
c语言·开发语言·arm开发·人工智能·缓存·矩阵
敲代码的嘎仔1 天前
互动问答系统实战:两级评论模型、ES 搜索集成、Caffeine 多级缓存全记录
java·开发语言·数据库·elasticsearch·缓存·mybatis·高并发
vortex51 天前
AI 提示词缓存命中机制解析
人工智能·缓存
huang5791471 天前
从缓存行角度优化链表遍历:批处理与预取策略
数据结构·链表·缓存
玄芯散人2 天前
【筑基·047】内存Hierarchy:寄存器到硬盘的速度差
缓存·内存·计算机基础