自动装箱对象的缓存数组问题

Integer Test

自动装箱对象的缓存数组问题_第1张图片

自动装箱对象的缓存数组问题_第2张图片

Long Test

自动装箱对象的缓存数组问题_第3张图片

自动装箱对象的缓存数组问题_第4张图片

注意 == 比较两个对象,是比较堆上对象的内存地址是否指向同一对象,equals比较的是字面值。

Integer源码

自动装箱对象的缓存数组问题_第5张图片

自动装箱对象的缓存数组问题_第6张图片

自动装箱对象的缓存数组问题_第7张图片
说明
  1. 缓存的最小值low为-128(不可变),缓存的最大值high默认为127,high可以通过启动应用程序时加上 -XX:AutoBoxCacheMax= 选项来指定high的值,当第一次使用Integer类型数据时,会加载IntegerCache这个静态内部类对象,然后在执行类的静态初始化,这个初始化会获取JVM的属性设置

  2. 当指定的size小于127,则还是使用默认设置,当大于127则根据指定的值设置high。

  3. 这个IntegerCache内部含有一个名字叫cache的Integer类型数组,长度为high-low +1,初始化过程会[low,high]范围的int类型的数据都包装成Integer类型,放入cache数组当中

  4. 当获取Integer数值时,在[low,hiht]范围内的则直接返回cache数组中对应的Integer对象,超出范围则创建一个Integer类型的数据

Long源码

自动装箱对象的缓存数组问题_第8张图片

需要注意的是虽然Long类型也缓存[-128,127]的数据,但是返范围是固定的不可调整的, -XX:AutoBoxCacheMax= 参数设置对Long类型的缓存也不起作用

其他包装类型的缓存情况

自动装箱对象的缓存数组问题_第9张图片

Character [0,127]

GC对缓存的影响

自动装箱对象的缓存数组问题_第10张图片

缓存数组cache永远不会被GC,除非Integer类对象被卸载。

VM参数设置Integer的缓存high

-XX:AutoBoxCacheMax= 参数设置对JVM client模式无效,只对sever模式有效。

总结

当系统当中的数字在一个较小的范围内变化,则可以通过缓存对象的方式,提前创建好对象,可有效减少频繁创建Integer对象的性能开销

你可能感兴趣的:(自动装箱对象的缓存数组问题)