关键词:
【中文标题】整数缓存有多大?【英文标题】:How large is the Integer cache? 【发布时间】:2013-02-24 13:31:34 【问题描述】:Integer
类具有缓存,用于缓存Integer
值。因此,如果我使用方法valueOf
或收件箱,新值将不会被实例化,而是从缓存中获取。
我知道默认缓存大小是127
,但可以根据 VM 设置进行扩展。我的问题是:这些设置中缓存大小的默认值有多大,我可以操纵这个值吗?这个值是否取决于我使用的 VM(32 位还是 64 位)?
我现在正在调整遗留代码,可能需要从 int 转换为 Integer。
澄清:我在 Java 源代码中找到的以下代码
private static class IntegerCache
static final int low = -128;
static final int high;
static final Integer cache[];
static
// high value may be configured by property
int h = 127;
String integerCacheHighPropValue =
sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
if (integerCacheHighPropValue != null)
int i = parseInt(integerCacheHighPropValue);
i = Math.max(i, 127);
// Maximum array size is Integer.MAX_VALUE
h = Math.min(i, Integer.MAX_VALUE - (-low));
high = h;
cache = new Integer[(high - low) + 1];
int j = low;
for(int k = 0; k < cache.length; k++)
cache[k] = new Integer(j++);
private IntegerCache()
public static Integer valueOf(int i)
assert IntegerCache.high >= 127;
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
所以我认为缓存是可配置的。
【问题讨论】:
它在Java源代码中。虚拟机设置与它无关。 不是从-128到+127吗?我认为它无法更改,除非 vm 允许配置(我从未见过)。 您可以使用系统属性java.lang.Integer.IntegerCache.high
设置不同的限制。这一切都在源代码中。
如何设置? System.setProperty 还是别的什么?
在较早的 java 版本中,它是不可配置的。在 Java 7 中是这样。
【参考方案1】:
内部 Java 实现,无法配置,范围是从 -128 到 127。您可以查看Javadocs
或直接查看来源:
public static Integer valueOf(int i)
final int offset = 128;
if (i >= -128 && i <= 127) // must cache
return IntegerCache.cache[i + offset];
return new Integer(i);
UPD。我错了(感谢 Marco Topolnik)。以上所有内容都与较旧的 Java 实现有关。 Java 7 可以通过系统属性实现:
-Djava.lang.Integer.IntegerCache.high=<size>
或JVM设置:
-XX:AutoBoxCacheMax=<size>
UPD。 2 java.math.BigInteger
具有值 -16 的硬编码缓存。来源:
private final static int MAX_CONSTANT = 16;
private static BigInteger posConst[] = new BigInteger[MAX_CONSTANT+1];
private static BigInteger negConst[] = new BigInteger[MAX_CONSTANT+1];
static
for (int i = 1; i <= MAX_CONSTANT; i++)
int[] magnitude = new int[1];
magnitude[0] = i;
posConst[i] = new BigInteger(magnitude, 1);
negConst[i] = new BigInteger(magnitude, -1);
public static BigInteger valueOf(long val)
// If -MAX_CONSTANT < val < MAX_CONSTANT, return stashed constant
if (val == 0)
return ZERO;
if (val > 0 && val <= MAX_CONSTANT)
return posConst[(int) val];
else if (val < 0 && val >= -MAX_CONSTANT)
return negConst[(int) -val];
return new BigInteger(val);
【讨论】:
java.math.BigInteger 有类似的缓存吗?【参考方案2】:对于 Java 7,我无法在 Oracle 的 Java 文档中找到关于使用 -XX:+AggressiveOpts 时会发生什么变化的确切描述。所以我运行了一个过程来确定aggressiveopts 对我们实验室中一个具有java 版本的应用服务器上的jvm 设置的影响: 引用 java版本“1.7.0_15” Java(TM) SE 运行时环境 (build 1.7.0_15-b03) quote
该过程是在aggressiveopts 禁用的情况下运行java: java -d64 -server -XX:-AggressiveOpts -XX:+UnlockDiagnosticVMOptions -XX:+PrintFlagsFinal -version
过程是在启用的情况下运行java: java -d64 -server -XX:+AggressiveOpts -XX:+UnlockDiagnosticVMOptions -XX:+PrintFlagsFinal -version
这个过程产生了这些差异:
bool AggressiveOpts false --> true 产品
intx AutoBoxCacheMax 128 --> 20000 C2 产品
intx BiasedLockingStartupDelay 4000 --> 500 产品
bool EliminateAutoBox false --> true C2 诊断
【讨论】:
【参考方案3】:来自Javadoc:
public static Integer valueOf(int i)
返回一个表示指定 int 值的 Integer 实例。如果一个 new Integer 实例不是必须的,这个方法一般应该是 优先于构造函数 Integer(int) 使用,因为此方法是 可能会产生明显更好的空间和时间性能 缓存经常请求的值。此方法将始终缓存 -128 到 127 范围内的值(含),并且可能缓存其他值 超出这个范围。
但是你真的不应该依赖这个或试图改变任何关于它的东西。这是 JVM 的实现细节,不会影响您的实现。
【讨论】:
虽然我认为依赖这个缓存是个坏主意,但我避免它的原因是我希望我的代码干净。我不同意您对“实施细节”的评论;这不是实现细节。如果它在 Javadoc 中,那么它就是绑定的:您可以放心地假设(如果您是丑陋代码的粉丝)-128
到 127
将被缓存。10000的阶乘有多大
参考技术A以下是lua4的对数方法估算程序:结果为: 参考技术B回答你好,10000的阶乘是一个35660位的正整数。所以,只能用科学记数法来表示:10000!=2.84625968091705451890641321211986889*10^35659 查看详情
单个 RDD 记录可以有多大?
...:valgraphInfo:RDD[(Long,Int,Long,Long,Iterable[Long])]节点用Long类型整数表示,将存储在graphInfo的Iterable[Long]中。Iterable中可以包含多少个元素?单个RDD记录的大小 查看详情
int和bigint差别有多大?
...符号的范围是0到18446744073709551615。int 普通大小的整数。带符号的 查看详情
如何确定 .NET 中的数据类型有多大?
...其他未知数。我知道在.NET中,一个字节是一个8位无符号整数,但这只是因为我读过它。如果我有一个非常简单的控制台应用程序,如下所示:staticvoidMain 查看详情
夹角有多大(代码片段)
...的第一行是一个数据T,表示有T组数据。每组数据有三个整数h(0<=h<24 查看详情
从一个目录读取许多小文件有多大问题?
...找是否会比实际阅读花费更多时间)?当文件被操作系统缓存时,运行时间的渐 查看详情
h330阵列卡和h730阵列卡性能有多大差距?
差距很大,H330阵列卡无缓存,H730阵列卡1G的缓存。阵列卡安装插入阵列卡并接好硬盘后,开机可以看到如图所示的硬盘信息,这里接了0-3四个硬盘,按Ctrl+S或F4进入阵列卡的BIOS设置界面。操作按键,↑↓移动光标,ESC返回,Enter... 查看详情
hdu2076夹角有多大(题目已修改,注意读题)
...的第一行是一个数据T,表示有T组数据。每组数据有三个整数h(0<=h<24 查看详情
为啥需要告诉结构它们有多大?
】为啥需要告诉结构它们有多大?【英文标题】:Whydostructuresneedtobetoldhowbigtheyare?为什么需要告诉结构它们有多大?【发布时间】:2010-05-3101:11:22【问题描述】:我注意到在c/c++中需要告诉许多Win32API结构它们有多大。即someStruct.p... 查看详情
再论:男人有多大责任和感恩代表着有多大的驾驭能力和事业能力
男人有多大责任和感恩代表着有多大的驾驭能力和事业能力是近来我跟一个老朋友交流的结论,因此今天我在这里具体的说明下。 先解释下什么是责任。什么是感恩 ... 查看详情
linux下socket接收缓冲区有多大?如何查看和修改,望高手赐教
参考技术Aintbuflen=65536*10;设置读缓存大小if(0!=setsockopt(m_sendUdpSock,SOL_SOCKET,SO_RCVBUF,&buflen,4))returnOS_ERROR;设置写缓存大小if(0!=setsockopt(m_sendUdpSock,SOL_SOCKET,SO_SNDBUF,&buflen,4))returnOS_ERROR;socklen_tgetnumlen=4;读取写缓存大小if(0!=getsockopt(g_sendUdpSo... 查看详情
lsiraid卡问题1.diskcachepolicy打开的意义有多大,考虑打开writeback的情况下针对写入,请懂行的
...了是否cache写入11、如果是LSI的硬件RAID卡也就是说RAID卡带缓存的可以打开writeback,这个时候数据写入有明显的提升,也就是数据先直接写入raid卡的缓存等IO空闲时在写入到硬盘。但是writeback有一个不好的地方就是机器突然断电(... 查看详情
一个物体有多大?为啥没有sizeof? [复制]
】一个物体有多大?为啥没有sizeof?[复制]【英文标题】:HowbigisanObject?Whyistherenosizeof?[duplicate]一个物体有多大?为什么没有sizeof?[复制]【发布时间】:2011-08-0106:03:30【问题描述】:可能的重复:InJava,whatisthebestwaytodeterminethesizeo... 查看详情
狂飙的后劲有多大,讲述的究竟是什么一个故事
狂飙的后劲有多大,讲述的究竟是什么一个故事,#看完狂飙的后劲有多大,#狂飙,#疯驴子!狂飙的后劲有多大,讲述的究竟是什么一个故事 查看详情
背景图像有多大?
】背景图像有多大?【英文标题】:Whatsizehasabackgroundimagetohave?【发布时间】:2015-12-2419:06:17【问题描述】:我正在用Swift(但不是spritekit)开发一款游戏,我在制作一个在每个设备上看起来都很棒的背景图像时遇到了很多麻烦。... 查看详情
input() 函数的输入可以有多大?
】input()函数的输入可以有多大?【英文标题】:Howbigcantheinputtotheinput()functionbe?【发布时间】:2017-03-2815:57:51【问题描述】:我提供给input()函数的输入可以有多大?不幸的是,没有简单的方法来测试它。在使用大量复制粘贴后,... 查看详情
UIBarButtonItem 图像应该有多大?
】UIBarButtonItem图像应该有多大?【英文标题】:HowbigshouldaUIBarButtonItemimagebe?【发布时间】:2010-12-0802:11:15【问题描述】:我正在寻找创建自己的自定义“按日期排序”和“按数字排序”按钮,我计划将它们作为右侧按钮放置在导... 查看详情
数据库统计有多大用处
】数据库统计有多大用处【英文标题】:Howusefulisdatabasestatistics【发布时间】:2014-04-2204:11:26【问题描述】:就查询性能而言,数据库统计信息有多大用处?我对SQLServer2014查询进行了数据库引擎调优,它说我可以将查询处理提高... 查看详情