我正在运行我的万无一失的测试,它让我进入了 GC 开销限制。然而,在分析内存统计数据和快照后,我意识到几乎 800 MB 的内存被浪费在字符串复制中。
进一步研究 VM 参数和其他运行时参数,我意识到使用的 GC 是 PS(Parallel Scavenger - JVM 的默认GC)。
我修改了surefire argLine以使用
-XX:+UseG1GC -XX:+UseStringDeduplication -XX:+PrintStringDeduplicationStatistics
现在我的测试运行正在使用 G1GC。
下面是切换GC前后的对比
我的问题:为什么 G1GC 使用了如此多的 Old Gen,并且在测试运行期间没有被收集。它不断增长。
其余的环境和参数以及其他一切都保持不变。唯一改变的是 GC 算法和重复数据删除。
我也一直在查看这些相关主题
JVM G1GC's mixed gc not collecting much old regions
最佳答案
除非达到阈值(默认为总堆的 45%),否则 G1GC 不会执行老年代收集。您可以通过将 XX:InitiatingHeapOccupancyPercent 设置为其他值来控制此阈值。
关于Java G1GC 从不收集 Old Gen,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53316565/