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

Integer Test


Long Test


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

Integer源码



说明
  1. 缓存的最小值low为-128(不可变),缓存的最大值high默认为127,high可以通过启动应用程序时加上 -XX:AutoBoxCacheMax=<size> 选项来指定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源码

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

其他包装类型的缓存情况


Character [0,127]

GC对缓存的影响


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

VM参数设置Integer的缓存high

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

总结

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容