通过在OpenJDK社区中提出一项计划,Java的G1垃圾收集器将受益于更高的吞吐量和减少的CPU使用率。
题为“ G1的吞吐后写入障碍”的JDK增强建议草案(JEP)将使收集器在禁用并发优化以达到更好的吞吐量时使用吞吐量优化的障碍,但以某些工作负载的延迟为代价对延迟不敏感。
该计划将通过新的JVM标志-XX:-G1UseConcRefinement
,该标志将关闭并发优化并允许G1使用“吞吐量写后屏障”。 G1UseConcRefinement
,默认情况下将启用G1UseConcRefinement
,而使用-XX:-G1UseConcRefinement
将提高G1的吞吐量并减少CPU使用率。 简化的写屏障的长度将短得多,从而提高了缓存命中率。 这种模式将减少处理脏卡和JIT编译器的编译工作量。 此外,该模式将通过收缩已记住的集而不使用每线程的脏卡队列来减少内存占用。
目前,G1具有比用于并发标记扫描收集器等更传统收集器的写入障碍更为复杂的后参考写入障碍。 这种复杂性很大程度上是由于对并发优化的支持,该并发优化将收集暂停中的某些扫描工作移至应用程序并发完成。 优化机制在执行期间会产生明显的开销。
该提议不会让Java虚拟机确定何时禁用并发优化和优化障碍。 禁用并发优化时,该提议也不会限制其他G1功能(例如字符串重复数据删除)的可用性。