调整 GC 以进行大型缓存刷新

2024-01-15

我的内存中有一个很大的缓存(使用com.google.common.cache.LoadingCache)。使用 Scheduler 会在 10 分钟后刷新,如下所示:

ScheduledExecutorService refresher = Executors.newSingleThreadScheduledExecutor();
    refresher.scheduleWithFixedDelay(
            new Runnable() {
                public void run() {
                    for (String key : cache.asMap().keySet()) {
                        cache.refresh(key);
                    }
                }
            }, 0, 10, TimeUnit.MINUTES);

我面临的问题是 - 每 10 分钟后老一代空间就会出现一个巨大的峰值。我假设发生这种情况是因为正在进行刷新,并且旧对象没有像创建新对象那样快地被清除。这可以在下图中看到。 (注:此图显示了 CMS GC,但我使用 G1GC 得到了相同的结果)。

我可以采取哪些步骤来优化这个特定问题?我可以使用 CMS 或 G1GC,但这些尖峰必须被压平。原因是,Full GC 正在启动,应用程序正在进入Stop The World GC.

我可以做些什么来优化缓存的代码以更有效地刷新它,这样就不会出现突然的峰值?


我假设发生这种情况是因为正在进行刷新,并且旧对象没有像创建新对象那样快地被清除。

使用分配分析器可以帮助测试该假设。

我可以采取哪些步骤来优化这个特定问题?我可以使用 CMS 或 G1GC,但这些尖峰必须被压平。原因是,Full GC 正在启动,应用程序将进入 Stop The World GC。

Full GC 通常表明收集器的并发部分跟不上分配速率。但要验证,您应该检查 GC 日志以了解 Full GC 的原因。 您可以尝试降低 IHOP、为并发 GC 工作提供额外的 CPU 核心或调整刷新任务的节奏,以便它们在 10 分钟间隔内更加分散。

您还应该检查混合集合的 GC 启发式日志(假设 G1GC)是否能够为混合集合选择任何区域。如果它直接从年轻回收到完整 GC,而没有任何混合回收,那么由于缓存的分配模式,其他一些启发式方法可能会出现问题。

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

调整 GC 以进行大型缓存刷新 的相关文章

随机推荐

  • 警告:preg_match() [function.preg-match]:未知修饰符“/”[重复]

    这个问题在这里已经有答案了 我正在尝试使用 preg match 返回页面源代码中 中包含的所有 URL 我正在使用的代码是 preg match http code matches 我收到以下错误 Warning preg match f
  • 这是参考什么?

    假设我有这样的课程 public class class1 extends Applet implements Runnable private String s private URL u 还有第二类 class TS extends T
  • Git“NO-HEAD”声明

    我在 Eclipse 中使用 EGit 插件 但每当我将项目添加到 Git 时 该插件都会在 Eclipse 目录视图中的项目文件夹旁边放置一个 NO HEAD 指示 难道我做错了什么 这是什么意思 它可以简单地意味着 在您进行第一次添加和
  • 如何以编程方式获取sqlite中所有表的列表

    如何以编程方式获取 sqlite 中所有可用表的列表 尝试这个 SELECT FROM sqlite master where type table
  • IsEnabled 的 WPF 元素数据绑定(但为 false)

    我是 WPF 的初学者 有一些事情我似乎无法弄清楚 我有一个CheckBox我想禁用时RadioButton未选择 我当前的语法是
  • 本地网络上的 Meteor 应用

    我正在学习如何使用 Meteor 如下所示教程 https www meteor com try 我知道 Meteor 自动将应用程序托管到两者localhost和我的 IPv4 地址 在本例中 192 168 1 100 当我访问时192
  • 将联接添加到已有 select_from() 的 SQL Alchemy 表达式

    注意 这是一个关于 SQL Alchemy 表达式语言而不是 ORM 的问题 SQL Alchemy 适合向现有查询添加 WHERE 或 HAVING 子句 q select bmt gene c id select from bmt ge
  • Javascript,为什么被视为八进制

    我将 id 作为参数传递给 JavaScript 函数 因为它来自 UI 所以用零填充 但它似乎有 也许 奇怪 的行为 console log 0000020948 20948 console log 0000022115 9293 whi
  • QTableWidget::itemAt() 返回看似随机的项目

    我刚刚开始使用 Qt 所以请耐心等待 当我使用 QTableWidget gt getItemAt 时 它返回的项目与我使用 currentItemChanged 并单击同一项目时不同 我相信有必要使用 itemAt 因为我需要获取单击的任
  • 首次设置 时 FacesContext#getViewRoot() 返回 null

    我正在尝试更改一页中的 JSF 应用程序区域设置 并且这必须更改我的所有页面区域设置 我已关注此链接 效果很好JSF 中的本地化 如何记住每个会话而不是每个请求 视图选择的区域设置 https stackoverflow com quest
  • 如何在 Java 中读取也具有空值的 Excel 单元格...?

    我正在使用 Apache POI 3 6 我有一个专栏是blank 我希望能够阅读它 然后转到下一栏 即使我能解决NullPointerException问题是我无法到达下一个牢房 这是我的代码片段 HSSFCell cell row ge
  • 从 Java 程序运行 SQL 文件脚本

    我有一组 SQL 文件可以转换我的原始数据集 目前 我打开每个文件并执行它 如何执行 Java 程序中的每个文件 目标是使这个过程更加自动化 我想做类似的事情SqlScript execute myScript sql NOTE这些 SQL
  • 为什么我们不能在堆栈上分配动态内存?

    在堆栈上分配内容非常棒 因为我们有 RAII 并且不必担心内存泄漏等问题 然而有时我们必须在堆上分配 如果数据真的很大 推荐 因为堆栈很小 如果要分配的数据的大小仅在运行时才知道 动态分配 两个问题 为什么我们不能分配动态内存 即大小为 仅
  • 节点 process.env 变量为空

    我正在构建我的第一个 Express 应用程序 它需要使用理想情况下保持安全的 API 密钥与 API 进行交互 所以我想遵循一个基本模式 将密钥 以及任何未来的环境变量 保存在一个 gitignored env根目录下的文件 为了不重新发
  • 如何绘制 (x,y,z)

    Is there anyway to plot x from x textbox y from y textbox and z from z textbox in vb form It is windows application I ha
  • 将文件名读入数组

    我想获取文件列表 然后将结果读入一个数组 其中每个数组元素对应一个文件名 这可能吗 不要使用ls it s 不打算 https mywiki wooledge org ParsingLs以此目的 使用通配符 shopt s nullglob
  • 如何使用findText不区分大小写?

    我尝试在 Google 文档中搜索字符串 默认情况下findText区分大小写 我该如何使用它不区分大小写 该参考文献称 使用正则表达式在元素内容中搜索指定的文本模式 这就是我尝试过的 function search string var
  • MongoDB C++,如何在插入时添加 ISODate 值

    这是关于新的 MongoDB C 驱动程序 不是旧版驱动程序 我可以这样插入文档 value Value document lt lt Key lt lt Value lt
  • .NET 中的字符串转换

    为什么 net中有这么多方法可以转换为字符串 我见过的方法是 ToString Convert ToString 和 string 有什么不同 Convert ToString obj 将指定值转换为其等效的字符串表示形式 将返回Strin
  • 调整 GC 以进行大型缓存刷新

    我的内存中有一个很大的缓存 使用com google common cache LoadingCache 使用 Scheduler 会在 10 分钟后刷新 如下所示 ScheduledExecutorService refresher Ex