扩展java整数缓存
由于缓存的原因,一般建议使用扩展java整数缓存,java,caching,integer,boxing,Java,Caching,Integer,Boxing,由于缓存的原因,一般建议使用Integer.valueOf(int)而不是newinteger(int) 在JDK 5+中,您应该真正使用valueOf,因为Integer现在在-128和127之间缓存Integer对象,并且可以返回相同的整数(0)每次都创建一个对象,而不是将对象构造浪费在一个全新的相同的Integer对象上 如何扩大范围?我想问你的问题是: 1) 为什么你的代码制造新的整数对象会伤害你?您是否有一个概要文件结果要共享,以证明生成过多整数会降低您的速度?一般来说,对象池是个坏主
Integer.valueOf(int)
而不是newinteger(int)
在JDK 5+中,您应该真正使用valueOf
,因为Integer
现在在-128
和127
之间缓存Integer
对象,并且可以返回相同的整数(0)
每次都创建一个对象,而不是将对象构造浪费在一个全新的相同的Integer
对象上
如何扩大范围?我想问你的问题是: 1) 为什么你的代码制造新的整数对象会伤害你?您是否有一个概要文件结果要共享,以证明生成过多整数会降低您的速度?一般来说,对象池是个坏主意。你需要一个好的理由来证明这一点 2) 你为什么要做新的整数(int)?如果您只是将其保留为基本int,不仅可以避免“创建新对象”。您根本不会创建任何对象。如果以后需要,自动装箱将处理将其转换为整数的问题
*免责声明我也不使用。。我编写了对性能敏感的代码,但从未达到手动将原始int转换为整数的程度。只要有可能,我就将其保留为int,如果需要,让JVM自动装箱。扩展缓存范围可能无法满足您的需要,但是如果您确实需要缓存更大的范围,可以使用此代码而不是Integer.valueOf(int)。您只需要将缓存范围值调整到所需的范围
private static class IntegerCache
{
private IntegerCache(){}
static final Integer cache[] = new Integer[-(-128) + 127 + 1];
static
{
for(int i = 0; i < cache.length; i++)
cache[i] = new Integer(i - 128);
}
}
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);
}
私有静态类整型缓存
{
私有整数缓存(){}
静态最终整数缓存[]=新整数[-128)+127+1];
静止的
{
for(int i=0;i 如果(i>=-128&&i您可以使用java.lang.Integer.IntegerCache.high属性来增加此缓存的大小。
例:
:
[…]根据语言规范的要求,为-128和127(包括-128和127)之间的值支持自动装箱的对象标识语义
如果你分析了你的应用程序,发现创建整数对象是一个热点,那么无论如何,复制整数缓存代码并用不同的范围编写你自己的代码。否则你最好花时间找到真正的热点并改进它们。显然,-XX:+AggressiveOpts将最大值设置为20000。请参阅上的答案虽然您没有明确回答OP的问题,但我完全同意您的看法。将这些“廉价”对象集中在一起几乎肯定是个坏主意。
java -Djava.lang.Integer.IntegerCache.high=4096 SomeClass.class