自动装箱对象的缓存数组问题
2017-06-20 本文已影响0人
zhanglbjames
Integer Test
Long Test
注意 == 比较两个对象,是比较堆上对象的内存地址是否指向同一对象,equals比较的是字面值。
Integer源码
说明
-
缓存的最小值low为-128(不可变),缓存的最大值high默认为127,high可以通过启动应用程序时加上 -XX:AutoBoxCacheMax=<size> 选项来指定high的值,当第一次使用Integer类型数据时,会加载IntegerCache这个静态内部类对象,然后在执行类的静态初始化,这个初始化会获取JVM的属性设置。
-
当指定的size小于127,则还是使用默认设置,当大于127则根据指定的值设置high。
-
这个IntegerCache内部含有一个名字叫cache的Integer类型数组,长度为high-low +1,初始化过程会[low,high]范围的int类型的数据都包装成Integer类型,放入cache数组当中。
-
当获取Integer数值时,在[low,hiht]范围内的则直接返回cache数组中对应的Integer对象,超出范围则创建一个Integer类型的数据。
Long源码
需要注意的是虽然Long类型也缓存[-128,127]的数据,但是返范围是固定的不可调整的, -XX:AutoBoxCacheMax=<size> 参数设置对Long类型的缓存也不起作用。
其他包装类型的缓存情况
Character [0,127]
GC对缓存的影响
缓存数组cache永远不会被GC,除非Integer类对象被卸载。
VM参数设置Integer的缓存high
-XX:AutoBoxCacheMax=<size> 参数设置对JVM client模式无效,只对sever模式有效。
总结
当系统当中的数字在一个较小的范围内变化,则可以通过缓存对象的方式,提前创建好对象,可有效减少频繁创建Integer对象的性能开销。