讲师中心 微信公众号
AI工具推荐 视频效率加速

Guava Cache 默认容量限制与内存边界分析

千墨大大_3911

千墨大大_3911

发布时间:2026-02-03 22:07:02

|

664人浏览过

|

来源于php中文网

原创

Guava Cache 默认容量限制与内存边界分析

guava cache 在未显式设置 `maximumsize()` 时无硬性条目数量上限,理论最大容量为 `integer.max_value`(约 21 亿),但实际受限于 jvm 堆内存,通常在达到理论极限前就会因 oom 而失败。

当使用 CacheBuilder.newBuilder().build() 创建缓存(如 Cache<String, Object> cacheWithoutSize = CacheBuilder.newBuilder().build();)时,Guava 不会自动施加任何容量限制——既无基于条目的 maximumSize(),也无基于权重的 maximumWeight(),更不启用基于时间或引用的自动驱逐策略。这意味着该缓存本质上是一个无自动淘汰机制的强引用映射容器,其生命周期和容量完全由 JVM 内存与用户代码逻辑控制。

从源码与设计契约来看,Guava 的 Cache 实现(底层为 LocalCache)在未配置容量约束时,条目数量的理论上限由 Java 数组索引与内部哈希表结构决定,即 Integer.MAX_VALUE(2³¹−1 ≈ 2.147×10⁹)。但这仅是数据结构层面的数学边界,绝非可用的安全阈值。

⚠️ 实际使用中,请务必注意以下关键事实:

JavaStoryDevelop
JavaStoryDevelop

你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在

下载
  • 内存早于数量见顶:假设每个缓存条目平均占用 128 字节(含 String 键、轻量对象值及 LocalCache 自身节点开销),容纳 1 千万个条目即需约 1.2 GB 堆空间;1 亿条目则超 12 GB。绝大多数生产环境 JVM 难以长期稳定支撑数十 GB 缓存堆,更不用说逼近 20+ GB 的临界点。
  • 无自动回收 → 内存泄漏风险极高:未配置 expireAfterWrite、expireAfterAccess 或 refreshAfterWrite,且未手动调用 invalidate() / invalidateAll(),缓存将无限增长,最终触发 OutOfMemoryError: Java heap space。
  • GC 压力陡增:大量短生命周期缓存对象会加剧年轻代 GC 频率;若对象被长期持有,还会抬高老年代占用,影响整体吞吐。

✅ 正确实践建议:

  • 始终显式设限:即使业务“暂无明确上限”,也应基于监控数据设定保守值,例如:
    Cache<String, Object> safeCache = CacheBuilder.newBuilder()
        .maximumSize(10_000)           // 明确条目上限
        .expireAfterWrite(10, TimeUnit.MINUTES)  // 辅助过期保障
        .recordStats()                 // 开启统计便于观测
        .build();
  • 结合权重控制更灵活:对大小差异大的值,优先使用 weigher() + maximumWeight():
    Cache<String, byte[]> blobCache = CacheBuilder.newBuilder()
        .maximumWeight(100_000_000) // 100 MB 总权重
        .weigher((k, v) -> v.length)  // 按字节数计算权重
        .build();
  • 监控先行:通过 cache.stats() 定期采集 hitRate()、evictionCount()、estimatedSize(),结合 JVM 堆使用率告警,实现容量治理闭环。

总之,CacheBuilder.newBuilder().build() 创建的是一个“自由但危险”的缓存——它赋予你完全控制权,也把内存安全责任全盘托付给你。在生产系统中,不设限 ≠ 无限制,而是将容量瓶颈从框架层转移到了运维与架构决策层。

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

更多
guava包作用
guava包作用

guava是一个java库,增强了java标准库,提供更有效率和易于使用的集合、实用程序、缓存和并发工具。想了解更多guava的相关内容,可以阅读本专题下面的文章。

5311

2024.05.29

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

6519

2023.08.02

treenode的用法
treenode的用法

​在计算机编程领域,TreeNode是一种常见的数据结构,通常用于构建树形结构。在不同的编程语言中,TreeNode可能有不同的实现方式和用法,通常用于表示树的节点信息。更多关于treenode相关问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2581

2023.12.01

C++ 高效算法与数据结构
C++ 高效算法与数据结构

本专题讲解 C++ 中常用算法与数据结构的实现与优化,涵盖排序算法(快速排序、归并排序)、查找算法、图算法、动态规划、贪心算法等,并结合实际案例分析如何选择最优算法来提高程序效率。通过深入理解数据结构(链表、树、堆、哈希表等),帮助开发者提升 在复杂应用中的算法设计与性能优化能力。

356

2025.12.22

深入理解算法:高效算法与数据结构专题
深入理解算法:高效算法与数据结构专题

本专题专注于算法与数据结构的核心概念,适合想深入理解并提升编程能力的开发者。专题内容包括常见数据结构的实现与应用,如数组、链表、栈、队列、哈希表、树、图等;以及高效的排序算法、搜索算法、动态规划等经典算法。通过详细的讲解与复杂度分析,帮助开发者不仅能熟练运用这些基础知识,还能在实际编程中优化性能,提高代码的执行效率。本专题适合准备面试的开发者,也适合希望提高算法思维的编程爱好者。

397

2026.01.06

C++ 数据结构与算法实现教程合集
C++ 数据结构与算法实现教程合集

以 C++ 为实现语言,系统讲解核心数据结构与算法,涵盖链表(单链表/双链表/环检测)、栈与队列(单调栈/优先队列)、二叉树(遍历/BST/AVL/红黑树)、哈希表(开地址法/链地址法)、图(邻接表/BFS/DFS/Dijkstra/拓扑排序)、常见排序算法(快排/归并/堆排/计数排序)的实现与复杂度分析,同时分享 LeetCode 刷题技巧、竞赛编程常用模板(二分/前缀和/滑动窗口/动态规划),帮助开发者夯实算法基础。

452

2026.05.09

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

5987

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2548

2023.08.10

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

0

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn