我们的垃圾收集器 —— Our Collectors 【翻译】
官方原文链接:https://blogs.oracle.com/jonthecollector/our-collectors
目录
1)UseParNew和UseParallelGC都使用多个GC线程收集年轻代。哪个更快?
2)为什么“ ParNew”和“ Parallel Old”不能一起使用?
一、垃圾收集器
1.1 垃圾收集器介绍
每个蓝色框代表一个收集器,用于回收垃圾。在年轻一代垃圾收集在黄色区域 和 老年代是在灰色区域。
- “串行” 是一个会产生 stop-the-world 的复制收集器,它采用单个GC线程。
- “ ParNew” 是一个会产生 stop-the-world的复制收集器,它使用多个GC线程。它与 “ Parallel Scavenge” 的不同之处在于它具有使其可以在CMS中使用的增强功能。例如,“ ParNew” 执行所需的同步,以便它可以在CMS 的并发阶段运行 。
- “ Parallel Scavenge” 是一个会产生 stop-the-world 的复制收集器,它使用多个GC线程。
- “ Serial Old” 是一个会产生 stop-the-world 的,使用单一GC线程的标记清除紧凑的收集器。
- “ CMS” 是一个并发的,低中断的收集器。
- “ Parallel Old” 是使用多个GC线程的压缩收集器。为我们的jdk6收集器使用-XX标志
1.2 垃圾收集器组合
- UseSerialGC 是 “ Serial” +“ Serial Old”
- UseParNewGC 是 “ ParNew” +“ Serial Old”
- UseConcMarkSweepGC是 “ ParNew” +“ CMS” +“ Serial Old”。大多数情况下,使用 “ CMS” 来收集保有权代。并发模式失败时使用 “ Serial Old”。
- UseParallelGC 是 “ Parallel Scavenge” + “ Serial Old”
- UseParallelOldGC 是 “ Parallel Scavenge” + “ Parallel Old”
二、常见问题解答
1)UseParNew和UseParallelGC都使用多个GC线程收集年轻代。哪个更快?
对于这个问题,没有一个正确的答案。大多数情况下,它们的表现都一样好,但是我已经看到一种在不同情况下比另一种要好。如果您想使用GC人体工程学,则只有UseParallelGC(和UseParallelOldGC)支持它,因此您必须使用它。
2)为什么“ ParNew”和“ Parallel Old”不能一起使用?
“ ParNew”以一种收集每一代都为其收集提供某些接口。例如,“ ParNew”(和“ Serial”)实现了space_iterate(),它将对年轻一代中的每个对象执行操作。使用“ CMS”或“ Serial Old” 收集保有权代时,GC可以使用space_iterate()对年轻代中的对象进行一些工作。这使收集器的混合匹配工作,但增加了收集器的维护和添加新收集器的负担。收集者的负担似乎是二次的。或者,“并行清除”(至少在“旧版”之前已实现了最初的实现)始终知道如何收集保有权代,并且可以直接在“旧版旧版”采集器中调用代码。“ Parallel Old”不是以“ ParNew”样式编写的,因此将其与“ ParNew”进行匹配不会在没有大量工作的情况下发生。顺便说一句,我们希望最终仅将“ Parallel Scavenge”与“ Parallel Old” 进行匹配,并清除“ Parallel Scavenge”与它们同时使用所需的任何临时代码。请不要对我上面使用的示例考虑太多。他们无疑是人为的,不值得您花时间。
3)如何将“ CMS”和“ Serial”一起使用?
-XX:+ UseConcMarkSweepGC -XX:-UseParNewGC。不要使用-XX:+ UseConcMarkSweepGC和-XX:+ UseSerialGC。尽管这看起来像是一种逻辑组合,但它会导致出现一条消息,说明有关收集器组合冲突的问题,并且JVM无法启动。
4)蓝色框是否带有“?” 错字了吗?
该框代表我们当前正在开发的新垃圾收集器,简称为Garbage First或G1。G1将提供更可预测的暂停,可更好的减少GC停顿时间,没有碎片集合中的并行性和并发性。更好的堆利用率G1跨越了年轻代-老年代的边界,因为它仅是逻辑上的世代收集器。G1将堆划分为多个区域Region,在GC期间可以收集区域的子集。它在逻辑上是世代的,因为它动态地选择一组区域来充当年轻一代,然后将在下一个GC中收集它们(就像年轻一代一样)。
用户可以指定一个可接受的暂停时间目标,G1将根据该时间做出估算(基于过去的收集)、(暂停目标)。该区域集称为收集集,G1将在下一个GC期间收集它。
G1可以选择垃圾最多的区域来首先收集(首先回收),以便最大程度地提高垃圾收集的效率。
G1紧凑,因此碎片问题不大;由于部分填充区域,可能会有内部碎片。堆不是静态地划分为年轻代和老年代,因此不存在大小不平衡的问题。
除了暂停时间目标外,用户还可以指定某个时间段内可用于GC 的时间比例的目标(例如,在接下来的100秒钟内,收集时间不超过10秒钟)。对于此类目标(在100 秒内的GC间隔为10秒),G1可以选择一个在预测可在10秒内完成的收集,并将该收集安排为距上一个收集90秒(或更长时间)。您可以看到邪恶的用户期望0收集时间,所以这又只是一个目标,而不是一个诺言。
如果G1能够达到我们预期垃圾回收效果,它将代替“ ParNew” +“ CMS” 成为更低延迟的垃圾收集器。如果您要问何时准备好,请不要因为我的沉默而生气。这是我们团队的最高优先项目,但它是软件开发,因此通常会有一些未知数。它会被JDK7 淘汰。就我们而言,G1垃圾越早成熟越好。
文章最后,给大家推荐一些受欢迎的技术博客链接:
- JAVA相关的深度技术博客链接
- Flink 相关技术博客链接
- Spark 核心技术链接
- 设计模式 —— 深度技术博客链接
- 机器学习 —— 深度技术博客链接
- Hadoop相关技术博客链接
- 超全干货--Flink思维导图,花了3周左右编写、校对
- 深入JAVA 的JVM核心原理解决线上各种故障【附案例】
- 请谈谈你对volatile的理解?--最近小李子与面试官的一场“硬核较量”
- 聊聊RPC通信,经常被问到的一道面试题。源码+笔记,包懂
- 深入聊聊Java 垃圾回收机制【附原理图及调优方法】
欢迎扫描下方的二维码或 搜索 公众号“大数据高级架构师”,我们会有更多、且及时的资料推送给您,欢迎多多交流!