在开始时管理JVMOldGen峰值
我们目前使用的 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 个大峰值,然后它设法保持稳定的和谐。我从一开始就期待稳定的和谐,但不确定一开始的行为。任何人都可以遇到这种情况或知道解决方法。
回答
您观察 G1 自适应 IHOP 的效果。
来自G1 调优指南:
初始堆占用百分比 (IHOP) 是触发初始标记收集的阈值,它被定义为老年代大小的百分比。
默认情况下,G1 通过观察标记需要多长时间以及在标记周期中通常在老年代分配多少内存来自动确定最佳 IHOP。此功能称为自适应 IHOP。如果此功能处于活动状态,则选项 -XX:InitiatingHeapOccupancyPercent 将初始值确定为当前老年代大小的百分比,只要没有足够的观察来对初始堆占用阈值进行良好的预测。使用选项 -XX:-G1UseAdaptiveIHOP 关闭 G1 的这种行为。在这种情况下,-XX:InitiatingHeapOccupancyPercent 的值始终确定此阈值。
默认情况下,-XX:G1AdaptiveIHOPNumInitialSamples等于 3。这意味着,G1 使用前 3 个完成的标记周期作为预测最佳 IHOP 的输入。
这种行为没有错,不需要“修复”任何东西。但是,如果您知道特定应用程序的最佳 IHOP 值,并且希望 GC 从一开始就使用它,请关闭-XX:-G1UseAdaptiveIHOP并-XX:InitiatingHeapOccupancyPercent手动设置。