Java G1GC永远不会回收Old Gen。

8

我在运行surefire测试时遇到了GC超限的问题。然而,在分析内存统计和快照后,我意识到几乎有800 MB的字符串重复浪费。

深入研究VM参数和其他运行时参数后,我发现使用的GC是PS(并行清道夫-来自JVM的默认GC)。

我修改了surefire argLine以使用

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

现在我的测试运行正在使用G1GC。
以下是切换GC前后的比较。

enter image description here

如果您对去重统计数据感兴趣。这里是: enter image description here 我的问题:为什么G1GC使用了这么多旧代,而且在测试运行期间不进行收集。它不断增长。
其余的环境、参数和其他所有内容都保持不变。唯一改变的是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

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


这个值真的是默认值吗?我没有显式地设置这个百分比,但我的当前老年代堆已经达到了最大堆的78%。 - Gorgon_Union
@Gorgon_Union 答案是错误的,该标志将在年轻代收集后触发“标记”阶段,如果导致完全 GC 或混合 GC 则是另一个问题。 - Eugene

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接