【问题标题】:Java G1GC is never collecting Old GenJava G1GC 从不收集 Old Gen
【发布时间】:2019-04-18 09:14:49
【问题描述】:

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

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

我修改了surefire argLine 以使用

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

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

下面是切换GC前后的对比

如果您对重复数据删除统计数据感兴趣。这里是:

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

【问题讨论】:

    标签: java garbage-collection g1gc


    【解决方案1】:

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

    【讨论】:

    • 这个值真的是默认值吗?我在没有明确设置这个百分比的情况下运行,而我当前的旧 gen 堆目前处于最大堆的 78%
    • @Gorgon_Union 答案是错误的,如果这会导致 Full GC 或 Mixed GC 是一个不同的问题。
    猜你喜欢
    • 1970-01-01
    • 2016-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-24
    相关资源
    最近更新 更多