-XX:+UseG1GC是否是-Xincgc的正确替代品?

16

目前,我们通过在Java命令中添加-Xincgc来使用增量垃圾收集器。在JDK 8中,这个开关已经被弃用了。那么它的等效替代是什么?-XX:+UseG1GC

背景:该应用程序有一个8GB的堆,并创建大量短生命周期对象。我注意到它经常暂停几秒钟来进行垃圾回收。出于好奇心,我添加了-Xincgc并发现暂停消失了,总体性能提高了约4倍。

不幸的是,我没有找到任何关于-Xincgc触发哪种类型的垃圾收集器的信息。有CMS(并发标记和清除)和新的G1(Garbage First),但是-Xincgc会得到什么呢?

3个回答

15
对于Oracle/OpenJDK 8,大多数机器上的默认收集器是Parallel Throughput Collector,但在一些32位Windows机器上可能是Serial GC。
Xincgc是CMS的增量模式。你看到的主要好处可能是由于从Throughput Collector切换到CMS,而不是来自增量模式,该模式设计用于单核CPU。 增量模式也已被弃用,所以只需通过-XX:+UseConcMarkSweepGC启用CMS,看看是否适用于您。更新:CMS也已被弃用,后来在较新的OpenJDK版本中被删除。
当然,您也可以尝试G1GC,它也旨在实现低暂停时间目标,并且具有不像CMS那样容易出现碎片化的优点,因此不太可能遇到导致单线程停止全球集合的并发模式故障。更新:较新的OpenJDK版本除了G1GC外还提供其他低暂停时间收集器。因此,请尝试两者并进行测量。
参见:

Oracle的Java 8 GC调优指南


非常详细的答案!谢谢。我将尝试使用-XX:+UseConcMarkSweepGC-XX:+UseG1GC,看看会得到什么结果。 - BetaRide
@BetaRide,你最终用了哪些开关来解决这个问题?当我使用“-Xincgc”时,我遇到了一个错误。 - tarekahf

3

虽然这个选项在Oracle的新版本中已经被完全弃用,但我们仍然可以使用它,只需应用以下JVM参数:

-XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode -XX:+PrintGCDetails -XX:+PrintGCTimeStamps

后面两个参数用于记录GC活动。

1

症状 在多处理器系统上,配置Java虚拟机垃圾回收器(GC)使用并发标记-清除(CMS)“增量”模式会导致性能比常规模式下的CMS更慢。

不幸的是,在网络上搜索Java调优页面时,有许多文档建议通过设置其中一个命令行开关-XX:+ CMSIncrementalMode或-Xincgc来使用增量模式的CMS。

https://support.oracle.com/knowledge/Middleware/1284201_1.html


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