Java G1GC从未收集过旧一代

时间:2018-11-15 09:47:21

标签: java garbage-collection g1gc

我正在运行surefire测试,这使我进入了GC开销限制。但是,在分析了内存统计信息和快照之后,我意识到在字符串复制中浪费了将近800 MB。

深入研究VM参数和其他运行时参数,我意识到所用的GC是PS(并行清道夫-JVM的默认值)。

我修改了surefire argLine以使用

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

现在我的测试正在使用G1GC。

以下是切换GC之前和之后的比较

enter image description here

如果您对重复数据删除统计信息感兴趣。这里是: enter image description here

我的问题:为什么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

1 个答案:

答案 0 :(得分:0)

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