首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏Java基础

    浅谈Integer缓存机制原理

    扩展:Byte,Short,Integer,Long 这 4 种包装类默认创建了数值 -128,127 的相应类型的缓存数据,Character 创建了数值在 0,127 范围的缓存数据,Boolean (128));//3.falseSystem.out.println(Integer.parseInt("128") == Integer.valueOf(128));//4.true1、2、3都好理解 ,缓存范围是 -128,127,1、2都在范围内,返回的是缓存中的对象,因此输出true,3不在范围内,返回的是新 new 的Integer,因此输出false。 128 在缓存范围外,按道理会 new 出一个Integer对象,为什么输出true呢? a * b : c);思考缓存机制存在的原因:将频繁被使用的对象缓存起来,可以提升读取的效率,这是一个典型的用空间换时间的例子(其实缓存机制都是这个原理),而Java开发者认为-128,127是比较常使用的范围

    39510编辑于 2024-08-19
  • 来自专栏java一日一条

    理解Java Integer的缓存策略

    首先看一个使用 Integer 的示例代码,展示了 Integer 的缓存行为。接着我们将学习这种实现的原因和目的。你可以先猜猜下面 Java 程序的输出结果。 Java 中 Integer 缓存实现 在 Java 5 中,为 Integer 的操作引入了一个新的特性,用来节省内存和提高性能。整型对象在内部实现中通过使用相同的对象引用实现了缓存和重用。 这种 Integer 缓存策略仅在自动装箱(autoboxing)的时候有用,使用构造器创建的 Integer 对象不能被缓存。 在程序中第一次使用 Integer 的时候也需要一定的额外时间来初始化这个缓存。 其他缓存的对象 这种缓存行为不仅适用于Integer对象。我们针对所有整数类型的类都有类似的缓存机制。

    1K10发布于 2018-09-18
  • 来自专栏全栈学习之路

    Integer缓存问题引发的分析

    ❝相信很多人都知道,Integer的值范围为-128到127,超过就会创建一个新的Integer对象,其实这里的值范围在jdk源码中是指缓存的值范围 ❞ 那么为什么会缓存这一段区间的数值? 缓存的区间可以修改吗?其它的包装类型有没有类似缓存? 1、源码分析 我们知道, Integer var = ? /Integer.valueOf:(I)Ljava/lang/Integer; 18: astore_3 19: sipush 188 22: invokestatic #2 / / Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer; 25: astore 4 27: getstatic #3 // Field 3、Long缓存问题 ❝前面我们分析了Integer缓存问题,举一反三,对Long也进行研究,看看二者有何不同 ❞ 1、源码分析 类似的,我们接下来分析 java.lang.Long#valueOf(long

    64230编辑于 2023-07-16
  • 来自专栏后端架构

    Integer判断相等之内存缓存

    Integer是一个封装类看一段代码 public static void main(String[] args) { Integer a = 127; Integer ; 18: astore_3 19: sipush 128 22: invokestatic #7 // Method java getstatic #13 // Field java/lang/System.out:Ljava/io/PrintStream; 46: aload_3 (i); }数组缓存的最低最高可以看到系统配置的属性,最高会和127做比较否则127就是最高调试代码可以看到到了127地址都不一样了看看cache的缓存内容从-128到127片段2看到初始化,这下子明白了吗 类缓存初始化 /** * Cache to support the object identity semantics of autoboxing for values between

    90110编辑于 2024-06-11
  • 来自专栏一个执拗的后端搬砖工

    jdk源码分析之Integer--缓存

    (1); Integer a3 = new Integer(1); System.out.println("a1 == a2 ? " + (a1 == a2)); System.out.println("a2 == a3 ?" + (a2 == a3)); Integer b1 = 127; Integer b2 = Integer.valueOf(127); Integer b3 = new Integer(127 + (b1 == b2)); System.out.println("b2 == b3?" + (b2 == b3)); } 运行结果如下: ? 以上是对jdk源码中Integer缓存做了一些分析,希望对各位带来帮助,如果有觉得分析不到位或者理解有偏差的,可以直接留言或者私聊我。

    66310发布于 2020-11-19
  • 来自专栏笔记本

    Java Integer包装类缓存机制详解

    Java Integer包装类缓存机制详解问题引入在解决力扣第76题「最小覆盖子串」时,我使用了Map<Character, Integer>来记录字符串中各字符的出现次数。 当包装类被加载到内存时,JVM会为其创建一个静态内部缓存类,该缓存保存在堆内存中。对于Integer类型,当数值在-128到127之间时,会直接使用缓存中的对象,此时==和equals()的效果相同。 重要区别:Integer.valueOf()方法:会使用缓存,对于-128到127范围内的数值,返回缓存中的对象Integer.parseInt()方法:不使用缓存,每次都会创建新的Integer对象示例代码 :Integer a = 127;Integer b = 127;System.out.println(a == b); // true,使用缓存Integer c = 128;Integer d = 128;System.out.println(c == d); // false,超出缓存范围Integer e = Integer.valueOf(100);Integer f = Integer.valueOf

    42121编辑于 2025-07-14
  • 来自专栏攻城狮的那点事

    你真的理解 Integer 的缓存问题吗?

    问原因则随口就说”Integer缓存了-128到127之间的整数对象“,为什么会缓存?还有其他答案?可能就不知道了。 what??? 难道这不是标准答案?还想咋地? ,如果是-128到127之间的整数,则会使用整数缓存对象,否则就new一个整形对象。 ; 18: astore_3 19: sipush 150 22: invokestatic #2 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer; 25: astore 4 27: getstatic #3 <high> 来设置缓存范围的最大值(包含)。

    1.6K20发布于 2019-08-22
  • 来自专栏明明如月的技术专栏

    你真的理解Integer的缓存问题吗?

    问原因则随口就说”Integer缓存了-128到127之间的整数对象“,为什么会缓存?还有其他答案?可能就不知道了。 what??? 难道这不是标准答案?还想咋地? (i); } 通过源码和注释可以看到 如果是-128到127之间的整数,则会使用整数缓存对象,否则就new一个整形对象。 java/lang/Integer.valueOf:(I)Ljava/lang/Integer; 25: astore 4 27: getstatic #3 cache[]; // 省略 } 可以看到可以通过设置虚拟机参数:XX:AutoBoxCacheMax=或 -Djava.lang.Integer.IntegerCache.high= 来设置缓存范围的最大值 另外缓存是 《Java语言规范》的要求,具体可以去语言规范里看。 三、总结 我们看一些文章的时候,不要止步于文章给出的标准答案,否则总是“背”文章,印象不深刻。

    61420发布于 2021-08-31
  • 来自专栏Java后端技术栈cwnait

    吊打面试官系列:说说Integer缓存范围

    2,如果使用int类型,注意int类型的初始值是0,很多设计某某状态时,很喜欢用0作为某个状态,这里要小心使用。 (num3.equals(num4)); System.out.println(num3 == num4); 面试题3 Integer num5 = 1000; Integer num6 = 1000 如果在面试中遇到面试题3,可以适当反问一下面试官是否有对缓存范围进行调整,或许某些面试官都会懵逼。 赤裸裸的吊打面试官。 总结 ? 1.引用类型的==是比较对应的引用地址。 2.Integer中使用的默认缓存是-128到127。但是可以在JVM启动的时候进行设置。 3.Integer b=Integer.valueOf(8);和Integer b=8;是一样的效果。 4.Integer.valueOf()方式,比较是否在缓存范围之内,在就直接从缓存中获取,不在new一个Integer对象。

    78921发布于 2020-12-14
  • 来自专栏FREE SOLO

    谈谈 Integer 的值缓存范围和对象大小

    关于 Integer 的值缓存 这涉及 Java 5 中另一个改进。构建 Integer 对象的传统方式是直接调用构造器,直接 new 一个对象。 但是根据实践,我们发现大部分数据操作都是集中在有限的、较小的数值范围,因而,在 Java 5 中新增了静态工厂方法 valueOf,在调用它的时候会利用一个缓存机制,带来了明显的性能改进。 按照 Javadoc,这个值默认缓存是 -128 到 127 之间。 那么Integer对象的大小是多少呢? Integer只有一个int类型的成员变量value,所以其对象实际数据部分的大小是4个字节,然后再在后面填充4个字节达到8字节的对齐,所以可以得出Integer对象的大小是16个字节。 因此,我们可以得出Integer对象的大小是原生的int类型的4倍。

    3.2K00发布于 2019-04-18
  • Java基础:128陷阱之Integer缓存源码研究

    Java中Integer的缓存实现 在Java 5中,对于Integer的操作引入了一个新功能来节省内存和提高性能。整型对象通过使用相同的对象引用实现了缓存和重用。 这个缓存会在Integer类第一次被使用的时候初始化出来。 在程序中,第一次使用Integer的时候也需要一定的额外时间来初始化这个缓存。 =59; int a2=59; Integer a3=Integer.valueOf(59); Integer a4=new Integer(59); System.out.println Integer a3 =Integer.valueOf(59); 因为 IntegerCache 中已经存在此对象,所以,直接返回引用。

    32500编辑于 2025-04-07
  • 来自专栏涓流

    缓存设计问题

    概述 缓存设计需要关注的点 关注指标: KV大小 读写峰值 命中率 缓存空间大小 置换策略 穿透加载时间 分类 本地缓存 远程缓存 应用模式 Cache Aside Read/Write Through Write Back Caching 技巧/Tips 不要把缓存当数据库使用 评估业务所需缓存空间大小 缓存会给系统带来数据不一致的风险 尽量设置过期时间 缓存对象太大需要考虑做压缩,减少存储空间以及传输中带宽的占用 引入多级缓存时,需要考虑数据一致性 提前考虑扩容问题 常见的缓存问题 缓存雪崩 很多使用场景,查询的缓存数据都是由定时任务取刷新,然后缓存查不到从 DB 查了在更新缓存。 这种同一时间大量缓存的失效,导致请求直接打到 DB 上的情况, 就是缓存雪崩。 缓存穿透 缓存穿透指的是缓存缓存和数据库中都没有的数据,而用户不断发起请求,让请求直接落再DB上,增加数据库压力,可能导致数据库被击垮。这种请求很可能是攻击者恶意发起的。

    76610编辑于 2022-06-28
  • 来自专栏allsmallpi博客

    LongCache机制与Long等值比较Integer 中的缓存类IntegerCache

    究其原因,竟是因为Long类型的LongCache机制引起,且因为测试环境的模拟用户数据量较少,没有突破LongCache内部缓存数组的边界,导致该问题没能及时在测试环境发现。 Java在数据封装类型的设计中,都带了.equals()方法。 四、其他内容 1、Integer、Short、Character、Bytes等封装类也有类似的机制; 2、请关注JVM参数:AutoBoxCacheMax 3、请关注Integer内部类IntegerCache int1 = Integer.valueOf("100"); Integer int2 = Integer.valueOf("100"); System.out.println i = 0; i < cache.length; i++) cache[i] = new Long(i - 128); } } Long也做了缓存

    95720发布于 2021-02-25
  • 来自专栏技术一号位指南(小诚信驿站)

    系统设计:缓存

    缓存可以存在于体系结构中的所有级别,但通常位于最靠近前端的级别,在那里实现缓存可以快速返回数据,而不会对下游级别造成负担。 应用服务器缓存 将缓存直接放置在请求层节点上可以实现响应数据的本地存储。 image.png cache-aside(旁路缓存) 发生在应用层,应用层保证缓存结果同DB的数据一致性,应用层来负责写入到数据库和整理缓存,缓存层则不必插手此事。 因此也会带来缓存穿透、缓存雪崩、缓存击穿、缓存数据不一致等问题 refresh-ahead 简单的说就是在缓存数据过期前,能自动的刷新缓存数据。举个例子来说,某条数据在缓存中,过期时间是60秒。 当在48-60秒这个区间取数据时,缓存先将之前缓存的结果返回给外部应用程序,然后异步的再从数据库去更新缓存中的值,以尽可能的保证缓存的值是最新的。 2.后进先出(LIFO):缓存逐出最近首先访问的块,而不考虑以前访问的频率或次数。 3.最近最少使用(LRU):首先丢弃最近最少使用的项目。

    3.1K483发布于 2021-07-05
  • 来自专栏JAVA杂谈

    性能设计 - 缓存

    Write Back 套路就是,在更新数据的时候,只更新缓存,不更新数据库,而我们的缓存会异步地批量更新数据库。这个设计的好处就是让数据的 I/O 操作飞快无比(因为直接操作内存嘛)。 在软件设计上,我们基本上不可能做出一个没有缺陷的设计,就像算法设计中的时间换空间、空间换时间一个道理。有时候,强一致性和高性能,高可用和高性能是有冲突的。 image.png 缓存设计的重点 缓存更新的模式基本如前面所说,不过这还没完,缓存已经成为高并发高性能架构的一个关键组件了。现在,很多公司都在用 Redis 来搭建他们的缓存系统。 另外,缓存是通过牺牲强一致性来提高性能的,这世上任何事情都不是免费的,所以并不是所有的业务都适合用缓存,这需要在设计的时候仔细调研好需求。使用缓存提高性能,就是会有数据更新的延迟。 缓存数据的时间周期也需要好好设计,太长太短都不好,过期期限不宜太短,因为可能导致应用程序不断从数据存储检索数据并将其添加到缓存。

    75820发布于 2020-04-24
  • 来自专栏架构专题

    3种堆内缓存算法,赠源码和设计思路

    由于过期也是缓存的一个重要特点。所有在设计这三种缓存算法时,需要额外的存储空间去存储这个过期时间。 以下将讨论这三种缓存算法的操作和设计要点,但暂未考虑高并发环境。 (也是面试考察点,偏设计而非算法) 普通的FIFO或许大家都能很简单的写出,增加了过期时间的考虑之后,在设计时需要多考虑。如下示例,为暂未考虑并发环境的FIFO设计。 设计思路 1)用普通的hashMap保存缓存数据。 2)需要额外的map用来保存key的过期特性,例子中使用了TreeMap,将“剩余存活时间”作为key,利用TreeMap的排序特性。 = expired; this.value = value; } } } LRU least recently used,最近最少使用,是目前最常用的缓存算法和设计方案之一 ,其移除策略为“当缓存(页)满时,优先移除最近最久未使用的数据”,优点是易于设计和使用,适用场景广泛。

    1.2K10发布于 2020-05-13
  • 来自专栏繁依Fanyi 的专栏

    Java Integer 缓存机制:小镇的居民与大城市的拥堵

    这就是 Integer 缓存机制的魔力所在!今天,让我们一同探索这个小镇,揭开 Java 整数的秘密,顺便享受一些轻松幽默的时刻。 整数的故事:从出生到缓存 在 Java 的宇宙中,每个整数都是通过 Integer 类诞生的。当你像“我想要一个 5”时,Java 立即为你创建了一个 Integer 对象。 缓存的工作原理 Java 的 Integer 缓存机制是通过 Integer 类的一个静态数组实现的,这个数组可以容纳 -128 到 127 之间的所有整数。 这意味着,如果两个 Integer 是相同的数字,但不在缓存范围内,使用 == 会导致错误的结果。 性能提升:缓存的魔力 说到性能,Integer 缓存机制的真正魔力在于它如何提高效率。想象一下,频繁地建造和拆除房屋,不仅耗费时间,还浪费资源。

    49910编辑于 2024-09-24
  • 来自专栏java大数据

    缓存层如何设计

    3)缓存层如何设计 马克-to-win:我们前面讲过 了n-tier架构。在我们的程序当中,还可以设计一个缓存层。 在去访问数据库之前,先看看缓存层中有没有数据,如果没有的话,从数据库取完数据回来,一 定要放在缓存层当中一份,下次就不用去数据库了。 马克-to-win:如果对数据库当中,某个数据更新了,同时一定要记住也更新一下缓存当中的数据。这样的话,既保证了缓存的 数据是最新的,也保证了将来查询时不用去查数据库,减轻了对数据库的压力。 可以做一个守护线程,发现某个表的版本变了,就重新把表的数据加载回你 的缓存。问题2,对于条件查询,如何处理缓存?比如30元到50元的衣服数据的第二页。 问题3,项目a处需要看表的 123列,b处需要看表的456列,缓存时就直接把123456列作为一个表缓存起来,供两处使用。马克-to-win:顺便说一句,缓存也可以缓存图片。

    1.1K00发布于 2021-10-10
  • 来自专栏数字积木

    SDRAM图像缓存设计

    用于临时缓存读写数据,解决数据的跨时钟域问题。 3,读写仲裁模块。 用于判断和控制从sdram中读写数据。 4,sdram控制器。 用来实现sdram的初始化配置,读写时序的实现。 该工程的总体设计概要图如下,从摄像图获取的的数据先临时缓存到写fifo中,然后再写入到sdram中,需要显示图像时,图像数据先从sdram临时储存到读fifo中,然后显示屏驱动模块读取fifo中的数据, 一张24bit的的全彩图的,每个像素点占据3byte的空间,常见的不同尺寸的图片一帧所占空间如下: 1080*1920*3byte=6,220,800byte=5,9mbyte; 960*480*3byte =1,382,400byte=1.3mbyte 480*272*3byte=391,680byte=0.3mbyte 通常板载的sdram的大小有16MB,32MB,64MB,128MB,等等,由设计成本决定 故需要有一个双时钟端口的用于读数据的fifo做数据的临时缓存。 3,何时将fifo中的数据写入sdram?

    1.3K20发布于 2021-04-15
  • 来自专栏golang云原生new

    缓存的设计方式

    ,我们每一次去访问,就会先去访问缓存 , 这样就能极大的提高访问效率和系统性能 可以看出,有一个优秀的保安相当重要 缓存的基本设计方式是什么样的 设计缓存自然也是为了解决系统是的低效问题,让系统可以高性能 ,高并发 例如我们直接访问单机的数据库如mysql 也就是上千级别的 qps,如果是访问 缓存的时候,就能达到上万,上十几万,这差距不是一点半点,是一个质的飞越 缓存的设计实际上就是 DB 和 缓存操作顺序以及谁来操作的事情 ,若缓存失效了,则是由缓存服务器自己将数据加载到缓存中 Write Through 是在更新数据库的时候,如果命中了缓存,则先更新缓存,再由缓存服务器自己去更新数据, 如果是没有命中缓存,那么就直接更新数据库 那么引入缓存除了可以带来高性能,高并发,自然也是有会带来一些问题的,例如: 缓存击穿 缓存穿透 缓存雪崩 如上 3 中情况,都是由于缓存这一层防线失守了,导致外部请求以各种各样的形式,各种各样的原因打到了数据库上 ,导致出现的问题,详细的 缓存击穿,缓存穿透,缓存雪崩的出现情况,解决方式可以查看历史文章 redis 缓存穿透,缓存击穿,缓存雪崩

    45730编辑于 2023-09-01
领券