Guava 地图中的驱逐惰性

2024-04-09

当前的地图驱逐算法相当懒惰。看起来过期的对象只有在访问数据结构时才会被驱逐。

例如,从地址到索引器的映射定义为:

ConcurrentMap<Address, Indexer> indexers = new MapMaker()
  .expireAfterAccess( EXPIRATION, TimeUnit.SECONDS)
  .evictionListener( new IndexEvicted())
  .makeMap();

导致相当令人惊讶的模式:而containsKey()在该地址的索引器被逐出后,给定地址立即返回 false。

使清理过程更加实时的推荐方法是什么? IE。删除接近实际过期时间的对象。

Update:我想进一步澄清实时的含义。对于上面的示例,EXPIRATION 为 10 秒,我希望看到插入的对象在上次访问后 10 秒内被逐出。现在这种情况还没有发生——必须以某种方式使用地图来开始驱逐。如果地图完全未使用,该物体可能会在那里停留数年。


为了及时驱逐,Guava 需要实现某种后台线程或定时重复任务。这样做会使映射变得更重,并且更难以在 J2EE 等环境或安全策略阻止随意生成线程的环境中使用。

如果您关心及时驱逐,请设置您自己的接触地图的定时线程。

另一方面,我确实同意让垃圾收集器触发驱逐会很好......例如通过使用 SoftReference 和终结器。 (是的,我知道终结器大多是邪恶的,我只是建议一种可选的最后手段策略。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Guava 地图中的驱逐惰性 的相关文章

随机推荐

  • 如何使用 Mock.Of() 模拟没有默认构造函数的类?

    使用起订量 我需要在现有的基础上创建一个假的class 不是接口 有没有默认的ctor 我可以使用 传统 语法来做到这一点 var fakeResponsePacket new Mock
  • 当绑定属性更改时,ListView 分组不会更新

    我正在使用依赖项属性 GroupDescription 根据列表视图项目源的属性对 WPF 列表视图中的项目进行分组 我的问题是 仅当 GroupDescription 值更改时才会更新分组 而不是在列表视图源中项目的绑定属性更改后分组才会
  • iOS 6 中视图控制器的旋转不正确

    在我的应用程序中 我一直在使用现已弃用的 shouldAutoRotateToFace 方法 现在 当使用 iOS 6 模拟器时 当设备处于横向时 我的所有子视图都会旋转到纵向 有谁知道这可能是什么原因造成的 我已经尝试使用supporte
  • 将 Firebase Analytics 添加到 Instant App

    我正在将现有应用程序转换为 Android Instant App 我已经成功地做到了这一点 我的应用程序以即时应用程序形式运行 我现在面临的问题是关于 Firebase Analytics 当我运行即时应用程序时 出现此错误 E Fire
  • :: 运算符必须与 tolower() 一起使用吗?

    transform mystr begin mystr end mystr begin tolower 我正在使用转换函数使字符串全部小写字母 但即使在编写 using namespace std 之后在我的程序顶部 我收到一大堆错误 当像
  • 如何使用 Python 从网页的检查元素中获取数据

    我想使用 Python 从检查元素获取数据 我可以使用 BeautifulSoup 下载源代码 但现在我需要来自网页的检查元素的文本 如果您能建议我如何去做 我将不胜感激 编辑 我所说的检查元素是指 在谷歌浏览器中 右键单击为我们提供了一个
  • 如何将 Visual Studio 宏值放入预处理器指令中?

    在我的项目中 我需要访问的价值 SolutionDir 运行时的宏 为此 我尝试添加预处理器条目 例如DEBUG ROOT SolutionDir or DEBUG ROOT SolutionDir 但这会由于无效的转义序列而导致各种编译器
  • 代码签名想要使用密钥签名 - 不允许或始终允许但拒绝有效

    我正在尝试构建并存档该应用程序 编译后 会出现一个警告窗口 要求 codesign wants to sign using key my account Name in your keychain 和按钮Always Allow Deny
  • 动态从模块导入类

    我有一堂课叫 my class 放在 my module 我需要导入这个类 我尝试这样做 import importlib result importlib import module my module my class 但它说 Impo
  • Net5 上的 ServiceProcessInstaller 在哪里?

    过去我使用过这些课程安装人员 https learn microsoft com en us dotnet api system configuration install installer view netframework 4 8 服
  • 将 Android 升级到 4.3 后,run-as 提示“程序包未知”

    我有一个简单的脚本 可以将数据库从手机下载到我的电脑 它使用 run as 效果很好 但现在 run as 说 包未知 我的应用程序已安装在设备上 没有任何变化 只是 Android 更新到了 4 3 你也有同样的问题吗 如何绕过这个或解决
  • SwiftUI:停止永远重复的动画

    我想在屏幕上有一个类似 徽章 的东西 当满足条件时 它会从正常尺寸弹到更大 然后反复恢复到正常尺寸 直到不再满足条件 不过 我似乎无法让徽章停止 弹跳 一旦开始 就势不可挡 我尝试过的 我尝试过使用一些动画 但它们可以分为使用 repeat
  • Android 版 OpenCV:示例项目 ClassNotFound 异常

    我正在尝试运行适用于 Android 的 opencv 示例 它不起作用 java lang RuntimeException Unable to instantiate activity ComponentInfo org opencv
  • Rake / Rspec:如何使用 --pattern 抑制/安静/静音显示命令的第一条输出行?

    Problem 如果我跑ServerSpec 基于RSpec 通过Rake使用以下命令之一 rake rake spec rake spec all rake spec
  • 将字符串拆分为数组数组[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我正在写一个iOS App in 斯威夫特 4 2 来自服务器的响应是一个字符串 其值由管道字符 分隔 它包含许多行值
  • Bash:如何仅在完整的行中复制交互式脚本的输入/输出?

    如何实时捕获脚本的输入 输出 例如使用 tee 但逐行而不是逐个字符 我的目标是仅在退格键和自动完成完成处理后 按下 RETURN 键后 捕获输入到脚本交互式提示中的输入 具体来说 我正在尝试为 ssh 创建一个包装器脚本 该脚本创建远程服
  • 无法从 SwingWorker 类更新 JProgressBar

    我有我的主 GUI 线程 其中有一个 JprogressBar 并正在实现 ProprtyChangeListener 当按下按钮时 扩展 SwingWorker 的不同类就会启动并执行一系列可能很长的计算 我需要 A 类中的进度条来根据
  • npm 崩溃并显示“ERR!cb() 从未调用”

    我试图使用安装 vue cli npm install g vue cli 我收到以下错误 Unhandled rejection Error EACCES permission denied mkdir home moeketsi npm
  • Android ffmpeg 简单 JNI 包装器

    我一直在尝试使用带有命令行访问的 ffmpeg 二进制文件一段时间 但一无所获 使用runtime exec 看起来我能够让它工作的唯一方法是使用 C 中的包装器来使用 JNI 访问构建的 ffmpeg 库 主要问题 我已经有超过五年没有编
  • Guava 地图中的驱逐惰性

    当前的地图驱逐算法相当懒惰 看起来过期的对象只有在访问数据结构时才会被驱逐 例如 从地址到索引器的映射定义为 ConcurrentMap