我们的垃圾收集器 —— Our Collectors 【翻译】

官方原文链接https://blogs.oracle.com/jonthecollector/our-collectors


目录

一、垃圾收集器 

1.1 垃圾收集器介绍

1.2 垃圾收集器组合 

二、常见问题解答

1)UseParNew和UseParallelGC都使用多个GC线程收集年轻代。哪个更快?

2)为什么“ ParNew”和“ Parallel Old”不能一起使用?

3)如何将“ CMS”和“ Serial”一起使用?

4)蓝色框是否带有“?” 错字了吗?


一、垃圾收集器 

1.1 垃圾收集器介绍

每个蓝色框代表一个收集器,用于回收垃圾。在年轻一代垃圾收集在黄色区域 和 老年代是在灰色区域。

  1. “串行” 是一个会产生 stop-the-world 的复制收集器,它采用单个GC线程。
  2. “ ParNew” 是一个会产生 stop-the-world的复制收集器,它使用多个GC线程。它与 “ Parallel Scavenge” 的不同之处在于它具有使其可以在CMS中使用的增强功能。例如,“ ParNew” 执行所需的同步,以便它可以在CMS 的并发阶段运行 。
  3. “ Parallel Scavenge” 是一个会产生 stop-the-world 的复制收集器,它使用多个GC线程。
  4. “ Serial Old” 是一个会产生 stop-the-world 的,使用单一GC线程的标记清除紧凑的收集器。
  5. “ CMS” 是一个并发的,低中断的收集器。
  6. “ Parallel Old” 是使用多个GC线程的压缩收集器。为我们的jdk6收集器使用-XX标志

1.2 垃圾收集器组合 

  1. UseSerialGC     是 “ Serial” +“ Serial Old”
  2. UseParNewGC 是 “ ParNew” +“ Serial Old”
  3. UseConcMarkSweepGC是 “ ParNew” +“ CMS” +“ Serial Old”。大多数情况下,使用 “ CMS” 来收集保有权代。并发模式失败时使用 “ Serial Old”。
  4. UseParallelGC  是 “ Parallel Scavenge”  + “ Serial Old”
  5. 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垃圾越早成熟越好。

 


文章最后,给大家推荐一些受欢迎的技术博客链接

  1. JAVA相关的深度技术博客链接
  2. Flink 相关技术博客链接
  3. Spark 核心技术链接
  4. 设计模式 —— 深度技术博客链接
  5. 机器学习 —— 深度技术博客链接
  6. Hadoop相关技术博客链接
  7. 超全干货--Flink思维导图,花了3周左右编写、校对
  8. 深入JAVA 的JVM核心原理解决线上各种故障【附案例】
  9. 请谈谈你对volatile的理解?--最近小李子与面试官的一场“硬核较量”
  10. 聊聊RPC通信,经常被问到的一道面试题。源码+笔记,包懂
  11. 深入聊聊Java 垃圾回收机制【附原理图及调优方法】

欢迎扫描下方的二维码或 搜索 公众号“大数据高级架构师”,我们会有更多、且及时的资料推送给您,欢迎多多交流!

                                           

       

猜你喜欢

转载自blog.csdn.net/weixin_32265569/article/details/108595332