1

我知道对于小于 128(默认)的值,整数的行为就像实习生,而不是大于 128 的值。我知道这已多次作为答案给出,但我没有注意到询问原因的地方。

所以我想知道的是为什么整数只对小于 128(默认)的值而不是大于 128 的值充当实习生?它如何改善更少的内存使用/高性能?

4

2 回答 2

5

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

此外,最大值可能不是 127,如果您设置它或使用类似的选项,它可能会更高-XX:+AggressiveOpts

很可能选择默认范围只是为了与字节保持一致。注意:缓存的值是

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

于 2013-07-17T08:35:20.747 回答
1

像这样看:

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

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

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

这对性能有何帮助?好吧,它加快了小数字的自动装箱,因为不必构造一个整数,而是从具有单个内存访问的缓存(很可能是一个整数 [128] 数组)中选择一个。同时,众所周知,许多整数是短暂的。使用不需要垃圾收集的预分配对象可以减轻 GC 的压力。

于 2013-07-17T10:04:10.400 回答