为什么Integers仅作为java中小于128(默认值)的值的实习生

时间:2013-07-17 08:29:02

标签: java performance memory

我知道Integers对于小于128(默认值)的值而言就像实习生一样,而不是对于超过该值的值。我知道这已经多次作为答案给出了,但是我没有注意到一个问题的地方。

所以我想知道的是,为什么整数仅作为小于128(默认值)的值的实习生而不是更多的值?它如何提高内存使用/高性能?

2 个答案:

答案 0 :(得分:5)

从技术上讲,这些值是在加载类时预先缓存的。它与String.intern()不同,您可以返回您创建的值。

此外,最大值可能不是127,如果你设置它可以更高或使用-XX:+AggressiveOpts等选项

可能会选择默认范围以与Byte保持一致。注意:缓存的值为

Boolean: both values
Byte: all
Character: 0 to 127
Short: -128 to 127
Integer: -128 to 127
Long: -128 to 127
Float and Double: none
BigInteger: -16 to 16 (in HotSpot Java 7)
BigDecimal: 0 to 10 (if you use valueOf(long)) and 
            0 to 0.000000000000000 (if you use valueOf(long, int)) (in HotSpot Java 7)

完成它的原因是提高性能并降低GC压力。

创建垃圾可以用垃圾填满你的缓存,减慢你所有的代码,它还需要工作来创建对象并清理它们。你的工作越少,你的课程就越快,越一致。

这是一篇很好的文章,它使http://www.javaspecialists.eu/archive/Issue191.html

有所不同

答案 1 :(得分:1)

这样看:

当然不希望缓存所有Integer值。因为,这意味着当JVM启动时,它必须生成超过40亿个Integer对象,这些对象很可能不适合当代计算机的存储。

因此,必须决定缓存一些较小数量的整数(如果有的话)。此数字应足够小,以便不会显示内存使用情况或启动速度较慢。 OTOH,它应尽可能涵盖大多数情况。没有阅读任何关于此的研究,但根据经验,我们可以充满信心地说,最常使用非常小的整数。

因此,缓存128个数字的决定完全是任意的,但它仍然有意义。它也可能是30或300.但肯定不是一百万。

这对性能有何帮助?好吧,它为小数字加速了自动装箱,因为不需要构造一个Integer,而是从缓存中选择一个(很可能是一个Integer [128]数组),只有一个memroy访问。与此同时,众所周知,许多整数都是短命的。使用不需要进行垃圾回收的预先分配的对象会消除GC的压力。