我知道对于小于 128(默认)的值,整数的行为就像实习生,而不是大于 128 的值。我知道这已多次作为答案给出,但我没有注意到询问原因的地方。
所以我想知道的是为什么整数只对小于 128(默认)的值而不是大于 128 的值充当实习生?它如何改善更少的内存使用/高性能?
我知道对于小于 128(默认)的值,整数的行为就像实习生,而不是大于 128 的值。我知道这已多次作为答案给出,但我没有注意到询问原因的地方。
所以我想知道的是为什么整数只对小于 128(默认)的值而不是大于 128 的值充当实习生?它如何改善更少的内存使用/高性能?
从技术上讲,这些值是在加载类时预先缓存的。它不像 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
像这样看:
缓存所有 Integer 值当然是不可取的。因为,这意味着当 JVM 启动时,它必须生成超过 40 亿个整数对象,这些对象很可能不适合现代计算机的内存。
因此,必须决定缓存一些较小数量的整数(如果有的话)。此数字应该足够小,以便不会注意到内存使用或启动速度较慢。OTOH,它应该涵盖尽可能多的情况。没有读过任何有关这方面的研究,但根据经验,我们可以自信地说,最常使用非常小的整数。
因此,缓存 128 个数字的决定是完全任意的,但它仍然有意义。也可以是 30 或 300。但肯定不是一百万。
这对性能有何帮助?好吧,它加快了小数字的自动装箱,因为不必构造一个整数,而是从具有单个内存访问的缓存(很可能是一个整数 [128] 数组)中选择一个。同时,众所周知,许多整数是短暂的。使用不需要垃圾收集的预分配对象可以减轻 GC 的压力。