【问题标题】:To manage JVM OldGen spike at the beginning在开始时管理 JVM OldGen 峰值
【发布时间】:2021-07-21 14:30:48
【问题描述】:

我们目前使用的 VMOptions 如下所示,用于我们使用 spring webflux 设计的微服务之一。我们目前为每个 pod 预留了 4 个 CPU 和 5 GB 内存。

-Xms4096m -Xmx4096m -Xss512k -XX:+UseG1GC -XX:+UseStringDeduplication -XX:ParallelGCThreads=8 -XX:ConcGCThreads=2 -XX:MaxGCPauseMillis=120 -XX:G1ReservePercent=10

每次我重新部署我们的应用程序并引入一些固定的 QPS 负载时,我观察到 OldGen 上会出现 3 个大的峰值,然后它设法进入了一些稳定的和谐状态。我从一开始就期待稳定的和谐,但不确定一开始的行为。任何人都可以遇到这种情况或知道解决方法吗?

【问题讨论】:

    标签: java performance garbage-collection jvm


    【解决方案1】:

    您观察 G1 自适应 IHOP 的效果。

    来自G1 tuning guide

    初始堆占用百分比 (IHOP) 是阈值 一个初始标记集合被触发,它被定义为 老年代大小的百分比。

    默认情况下,G1 通过观察自动确定最佳 IHOP 标记需要多长时间以及通常分配多少内存 标记周期中的老一代。此功能称为 自适应 IHOP。如果此功能处于活动状态,则该选项 -XX:InitiatingHeapOccupancyPercent 确定初始值占当前老年代大小的百分比,只要有 没有足够的观察来很好地预测启动 堆占用阈值。使用 选项 -XX:-G1UseAdaptiveIHOP。在这种情况下,价值 -XX:InitiatingHeapOccupancyPercent 始终确定此阈值。

    默认情况下,-XX:G1AdaptiveIHOPNumInitialSamples 等于 3。这意味着,G1 使用前 3 个完成的标记周期作为预测最佳 IHOP 的输入。

    这种行为没有错,不需要“修复”任何东西。但是,如果您知道特定应用程序的最佳 IHOP 值,并希望 GC 从一开始就使用它,请关闭 -XX:-G1UseAdaptiveIHOP,并手动设置 -XX:InitiatingHeapOccupancyPercent

    【讨论】:

    • 好信息,只是一点警告:就像许多其他自调整值一样:将其设置为固定值也会增加“正确”值随时间变化的风险(由于代码的变化或在使用模式中),从长远来看,使用固定值可能比不指定值更糟糕。
    • @JoachimSauer 或者反过来也可以。这是我亲身经历的example
    猜你喜欢
    • 1970-01-01
    • 2016-09-10
    • 2019-06-14
    • 2015-10-25
    • 1970-01-01
    • 1970-01-01
    • 2015-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多