Java G1GC 从不收集 Old Gen

标签 java garbage-collection g1gc

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

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

我修改了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

最佳答案

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

关于Java G1GC 从不收集 Old Gen,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53316565/

相关文章:

java - 如何让 G1 打印更多日志详细信息?

java - 灰度图像滤镜

java - JVM 的沙盒脚本语言?

memory - JavaFX 和监听器内存泄漏

python - Python 中的垃圾回收如何与类方法一起工作?

java - 是什么导致 Java 7 中的 G1 垃圾收集器中止其并发标记阶段?

java - 将字符串添加到 Java 中的对象列表中

java - Sonar 多模块 Gradle Android 忽略projectBaseDir

java - 哪个循环的性能更好?为什么?

java - 垃圾收集过程中什么是引用处理