如何理解 Integer 缓存池(-128~127)的生效范围及如何手动调整缓存上限

风萱君_8864

风萱君_8864

2026-04-20

591人浏览

原创

integer缓存池仅对integer.valueof()或自动装箱且值在-128至127(默认)范围内的对象生效;下限-128硬编码不可改,上限可通过-djava.lang.integer.integercache.high调整,默认127。

如何理解 integer 缓存池(-128~127)的生效范围及如何手动调整缓存上限

Integer 缓存池的生效范围不是“所有 Integer 对象都参与”,而是严格限定在 通过 Integer.valueOf() 或自动装箱(如 Integer a = 100;)创建的对象,且数值落在 -128 到 127(含)之间时才复用缓存对象。超出此范围或使用 new Integer() 构造,则一定新建实例。

缓存真正起作用的三种情况

只有满足以下全部条件,才会命中缓存:

  • 调用的是 Integer.valueOf(int) 方法(包括编译器自动插入的装箱,例如 Integer i = 127;)
  • 传入的 int 值 ≥ -128 且 ≤ 当前缓存上限(默认 127)
  • 该值尚未被 GC 回收(缓存对象在类加载时初始化,长期存活)

为什么下限 -128 不可改、上限却可以调?

这是 JVM 规范与实现权衡的结果:

  • -128 是硬编码在 IntegerCache.low 中的,源于 byte 类型最小值,也是语言规范强制要求的最低保障范围,所有 JVM 必须支持
  • 上限默认为 127,但可通过 JVM 参数扩大,因为实际缓存数组长度由 IntegerCache.high 决定,而该字段在静态块中读取系统属性 java.lang.Integer.IntegerCache.high
  • 注意:设为小于 127 的值(如 100)不会生效,JVM 会自动回退到 127

手动调整缓存上限的操作方式

仅需在启动 JVM 时添加系统属性参数:

  • 命令行运行:java -Djava.lang.Integer.IntegerCache.high=256 YourMainClass
  • IDEA 配置:Run → Edit Configurations → VM options → 填入 -Djava.lang.Integer.IntegerCache.high=256
  • Eclipse 配置:Run → Run Configurations → Arguments → VM arguments → 同上

设置后,Integer.valueOf(200) 就会返回同一个对象(即 a == b 为 true),但 new Integer(200) 和 Integer.valueOf(300) 仍各自新建。

验证缓存是否生效的简单写法

不用依赖日志或调试,一段代码即可确认:

Integer x = Integer.valueOf(200);
Integer y = Integer.valueOf(200);
System.out.println(x == y); // 设置 high=256 后输出 true;未设置则为 false

关键点:必须用 valueOf(),必须用相同数值,且该数值需落在新设定的范围内。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.02

6519

3

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.08.29

3165

6

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

2025.08.29

4068

10

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

2025.08.29

2805

10

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

2026.10.22

0

11

Gradle Wrapper配置教程
Gradle Wrapper配置教程

本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。

2026.10.22

0

10

Golangci-lint检查器使用教程
Golangci-lint检查器使用教程

本专题整理Golangci-lint常用Linters的用途与配置方法,覆盖错误处理、无效代码、安全、复杂度、命名和依赖检查,帮助项目合理选规则。

2026.10.22

0

15

Gradle怎么构建Java项目
Gradle怎么构建Java项目

本专题介绍Gradle Java项目构建方法,涵盖Java插件配置、依赖声明、源码编译、测试执行和打包检查,帮助你理解各阶段的任务关系,逐步完成项目构建。

2026.10.22

0

10

PHP时间戳漏洞修复教程
PHP时间戳漏洞修复教程

本专题汇总PHP常见时间戳漏洞,包括2038年溢出、时区漂移、时间戳伪造、重放攻击、时间盲注与日志审计失效等,并给出升级64位环境、使用 DateTimeImmutable、统一UTC、严格超时校验、预处理绑定、hash_equals 比对等修复方案,帮助开发者快速排查和加固时间相关代码。

2026.10.22

0

25

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.9万人学习