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

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

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

相关文章

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

    Integer Test Long Test 注意 == 比较两个对象,是比较堆上对象的内存地址是否指向同一对象,...

  • java基础-基础类型学习笔记

    基础类型 JDK缓存了1字节封装对象Integer,-128~127自动装箱会取缓存中的Integer对象。通过自...

  • jdk5新特性

    自动装箱与拆箱 // 自动装箱:值转对象Integer n = 1;// 自动拆箱:对象转值int m = n; ...

  • 学习路线

    Java Se基础 Java基础语法、数组、类与对象、继承与多态、异常、范型、集合、流与文件、反射、枚举、自动装箱...

  • Java基础-数据类型缓存解析

    基本类型缓存解析 Integer缓存解析: 1、使用自动装箱(Integer i = 1)方式创建Integer对...

  • Java自动装箱与拆箱

    自动装箱就是Java自动将原始类型值转换成对应的对象,比如将int的变量转换成Integer对象,这个过程叫做装箱...

  • Java中食之无味弃之可惜的数组

    在Java的泛型出现之前,只有数组可以用来存储指定类型的对象;在自动装箱机制出现之前,只有数组可以用来存储基本数据...

  • java自动装箱与拆箱

    首先我们来解释下什么叫做自动装箱与拆箱:自动装箱就是Java自动将原始类型值转换成对应的对象,反之将对象转换成原始...

  • Java自动装箱和拆箱机制

    自动装箱与拆箱概念 比如 这个过程中会自动根据数值创建对应的 Integer对象,这就是装箱。而 自动将包装器类型...

  • JAVA-收集-持续更新...

    1、阐述下对象的自动装箱和拆箱 2 基本数据类型的自动装箱(autoboxing)、拆箱(unboxing)是自...

网友评论

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

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