我知道Integers对于小于128(默认值)的值而言就像实习生一样,而不是对于超过该值的值。我知道这已经多次作为答案给出了,但是我没有注意到一个问题的地方。
所以我想知道的是,为什么整数仅作为小于128(默认值)的值的实习生而不是更多的值?它如何提高内存使用/高性能?
答案 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的压力。