美文网首页
自动装箱对象的缓存数组问题

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

作者: zhanglbjames | 来源:发表于2017-06-20 15:30 被阅读0次

    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对象的性能开销

    相关文章

      网友评论

          本文标题:自动装箱对象的缓存数组问题

          本文链接:https://www.haomeiwen.com/subject/kzsnfxtx.html