当前位置: 首页> 教育> 幼教 > 互联网营销优势_容桂疫情最新公布_百度推广怎么找客户_竞价推广代运营

互联网营销优势_容桂疫情最新公布_百度推广怎么找客户_竞价推广代运营

时间:2025/7/13 12:06:49来源:https://blog.csdn.net/qq_63255075/article/details/145716088 浏览次数:0次
互联网营销优势_容桂疫情最新公布_百度推广怎么找客户_竞价推广代运营

问题:

Java的Integer类内部实现了一个静态缓存池,用于存储特定范围内的整数值对应的Integer对象。默认情况下,这个范围是-128至127。当通过lnteger.valueOf(int)方法创建一个在这个范围内的整数对象时,并不会每次都生成新的对象实例,而是复用缓存中的现有对象,会直接从内存中取出,不需要新建个对象。

实践:

public class Test {public static void main(String[] args) {Integer a = Integer.valueOf(1);Integer b = Integer.valueOf(1);System.out.println(a==b);;}
}

源码:

  private static class IntegerCache {//整体的思路就是 //1.valueof或者自动装箱调用该类的静态代码块//2.可以通过jvm设定最大值,也可以不设定//3.设定好最大值,计算范围,生成新的数组赋值给归档文件,//4.最后再赋值给cache缓存//缓存的下界,默认值为 -128,固定不可修改static final int low = -128;//缓存的上界,默认值为 127,但可以通过 JVM 参数动态调整//java -Djava.lang.Integer.IntegerCache.highstatic final int high;//缓存数组,存储从 low 到 high 范围//这个数组就是缓存机制的核心static final Integer[] cache;//一个额外的缓存数组,用于支持 Java 的 Class Data Sharing (CDS) 功能。//CDS 是一种优化技术,允许将共享的类数据(如缓存池)保存到归档文件中,从而加速 JVM 启动。//archivedCache就是归档缓存static Integer[] archivedCache;//静态代码块在类加载时执行,负责初始化缓存池。//IntegerCache 的 static 块会在第一次调用 Integer.valueOf(int) 或使用自动装箱时触发,也就说会触发缓存池static {// high value may be configured by property// 上界可以通过配置这个属性int h = 127;//此时配置的上界是127//你可以通过java -Djava.lang.Integer.IntegerCache.high=设置最高值//java -Djava.lang.Integer.IntegerCache.high=256里设置为256String integerCacheHighPropValue =VM.getSavedProperty("java.lang.Integer.IntegerCache.high");//integerCacheHighPropValue 就是你设置的值//如果integerCacheHighPropValue不为空if (integerCacheHighPropValue != null) {try {//1.integerCacheHighPropValue转换成int值//2.比较 默认的127的和你设置的值,取最大h = Math.max(parseInt(integerCacheHighPropValue), 127);// Maximum array size is Integer.MAX_VALUE//* Integer.MAX_VALUE 是 Java 中 int 类型的最大值,等于 2^31 - 1,即 2147483647。它表示 int 类型能够存储的最大正整数。low 是缓存池的下界,默认值为 -128。(-low) 表示下界的绝对值,即 128。Integer.MAX_VALUE - (-low)这部分计算了从 low 到 Integer.MAX_VALUE 的整数个数。公式:Integer.MAX_VALUE - (-low) 等价于 Integer.MAX_VALUE + low。Integer.MAX_VALUE - (-low) - 1减去 1 是为了确保数组的长度不会超出 Integer.MAX_VALUE。数组的长度由 (high - low) + 1 决定,因此需要限制 high 的最大值。*///这个就是保证h在合法int范围内h = Math.min(h, Integer.MAX_VALUE - (-low) -1);} catch( NumberFormatException nfe) {// If the property cannot be parsed into an int, ignore it.//如果这个属性不能被解析为整数,忽略它}}//赋值给highhigh = h;// Load IntegerCache.archivedCache from archive, if possible//从归档文件中加载缓存,如果存在的话CDS.initializeFromArchive(IntegerCache.class);// 计算容量// high - low = 127 - (-128) = 255// + 1是因为要算上边界 // eg.6 - 1 = 5, 但是之间这是之间差5个数 // 如果 把左边界1算上,那就是 1 2 3 4 5// 那还少一个6,所以要加1int size = (high - low) + 1;// Use the archived cache if it exists and is large enough//从归档文件里查找如果没有该缓存或者是所需容量的size>大于缓存的长度//就创建一个新的数组if (archivedCache == null || size > archivedCache.length) {//创一个size大小的数组Integer[] c = new Integer[size];//j=-128int j = low;//-128一直自增到c.length 也就是256//但是是加到255就停止,因为i < c.length而不是等于 i < 256for(int i = 0; i < c.length; i++) {c[i] = new Integer(j++);}//把新生成的数组给归档文件archivedCache = c;}//再给cache,到这里就完成了缓存cache = archivedCache;//确保IntegerCache.high的值至少为127,即保证了缓存至少包含从-128到127的所有整数值,确保合理范围// range [-128, 127] must be interned (JLS7 5.1.7)assert IntegerCache.high >= 127;}//这是一个静态类,不需要实例化,所以需要私有private IntegerCache() {}}

归档文件

归档文件是一个特殊的文件,通常命名为 classes.jsa(Java Shared Archive),用于存储以下内容:

  • 类元数据 :如类的结构信息。
  • 常量池 :如字符串常量、方法引用等。
  • 缓存池 :如 IntegerCache 的缓存数组。

它的主要目的是:

  1. 加速 JVM 启动 :通过预加载常用类的数据,减少类加载的时间。
  2. 节省内存 :多个 JVM 实例可以共享同一个归档文件,避免重复加载相同的类数据。

归档文件的内容

归档文件中存储了以下类型的数据:

(1) 类元数据
  • 类的结构信息,包括类的字段、方法、继承关系等。
  • 这些数据在 JVM 加载类时会被直接使用,避免重新解析 .class 文件。
(2) 常量池
  • 常量池中存储了类中的常量数据,例如:
    • 字符串常量(如 "Hello")。
    • 方法引用、字段引用等符号引用。
  • 这些数据可以直接从归档文件中读取,而无需重新解析。
(3) 缓存池
  • 某些类(如 IntegerCache)的缓存数据也会被存储到归档文件中。
  • 例如,IntegerCache 的缓存数组(archivedCache)可以从归档文件中加载,避免每次运行时重新创建。
关键字:互联网营销优势_容桂疫情最新公布_百度推广怎么找客户_竞价推广代运营

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: