我正在运行我的万无一失的测试,它让我进入了 GC 开销限制。然而,在分析内存统计数据和快照后,我意识到在字符串复制中浪费了近 800 MB。

进一步查看 VM 参数和其他运行时参数,我意识到使用的 GC 是 PS(Parallel Scavenger - JVM 的默认值)。

我修改了万无一失的 argLine 以使用

-XX:+UseG1GC -XX:+UseStringDeduplication -XX:+PrintStringDeduplicationStatistics

现在我的测试运行使用 G1GC。

下面是切换GC前后对比

Java G1GC 从不收集 Old Gen-LMLPHP

如果您对重复数据删除统计感兴趣。这里是:
Java G1GC 从不收集 Old Gen-LMLPHP

我的问题 :为什么 G1GC 使用了如此多的 Old Gen 并且在测试运行期间没有被收集。它继续增长。

其余的环境和参数以及其他一切都保持不变。唯一改变的是 GC 算法和重复数据删除。

我也一直在看这些相关的主题

JVM G1GC's mixed gc not collecting much old regions

String Deduplication feature of Java 8

https://openjdk.java.net/jeps/192

最佳答案

除非达到阈值(默认为总堆的 45%),否则 G1GC 不会进行老年代收集。您可以通过将 XX:InitiatingHeapOccupancyPercent 设置为其他值来控制此阈值。

10-07 22:37