Java G1GC 从不收集 Old Gen

dha*_*ram 8 java garbage-collection g1gc

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

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

我修改了 Surefire argLine 来使用

-XX:+UseG1GC -XX:+UseStringDeduplication -XX:+PrintStringDeduplicationStatistics
Run Code Online (Sandbox Code Playgroud)

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

下面是切换GC前后的对比

在此输入图像描述

如果您对重复数据删除统计数据感兴趣。这里是: 在此输入图像描述

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

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

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

JVM G1GC 的混合 gc 没有收集太多旧区域

Java 8 的字符串去重特性

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

Dav*_*oko 0

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