JVM学习日记⭐️Shenandoah收集器的前世今生

278 阅读4分钟

“这是我参与8月更文挑战的第25天,活动详情查看:8月更文挑战

🔉引言

讲完了经典的垃圾收集器,接下来说说低延时的垃圾收集器,平时虽然接触不到,但不是说啥时候学啥时候用,而是要先有个基础,因为好多东西不是现学就赶趟,也不是现用就会用的,要稳扎稳打,一步一个脚印,走好每一步⛳,我的文章不针对面试,也不以不华丽的语言进行包装,只是说我眼中的它是什么,如果你感兴趣,那就和我一起看看👀吧。

🌁Shenandoah收集器

🌀Shenandoah的孤独

我们这个社会竞争激烈,天才难免都会遭到排挤,更别说垃圾收集器的世界了,Shenandoah收集器是第一款不是由原公司所领导开发的HotSpot垃圾收集器,不可避免的遭到排挤,毕竟不是亲生的,偏爱自然少一点,少到什么程度呢?就是说你只有在OpenJDK才能见到它,商业的OracleJDK完全排除。

那有血缘的是哪家公司呢,当然是大名鼎鼎的RedHat,什么,你没听过?那你是不是没听过狼来的故事呀,啊哈哈,没有,开个玩笑,红帽的目标比较明确,就是把该收集器打造成在任何堆内存的大小下都能把垃圾收集的停顿时间限制在10MS以内,哇,牛逼。这意味着什么呢?我们前面介绍过的CMSG1,只是做了并发的标记动作,那Shenandoah收集器说了:我还要做并发的垃圾清理后的整理动作。

🌀G1的继承者

相比血统更纯正的ZGC,Shenandoah收集器更像G1的下一代继承者,二者有很多相似之处,甚至还共享了一部分源代码,虽然Shenandoah收集器也是有着Region的内存布局,也有着存储大对象的Humongous Region,但Shenandoah收集器相比G1还是做了一些改进的,不然怎么把G1拍在沙滩上啊。

那相比G1,至少有三点不同:

  • 支持并发整理算法
  • 默认不使用分代收集
  • 用连接矩阵(Connection Matrix)替换了记忆集

并发整理那是镇山之宝,后续慢慢讲,没有实现分代,并不是说分代不重要,而是出于性价比的权衡,才把其放到优先级较低的位置上。Shenandoah收集器摒弃了记忆集,改用连接矩阵来记录跨代Region引用的关系,降低了处理跨代引用指针的资源消耗,也降低了伪共享问题(传送门【伪共享】)。

那连接矩阵是个什么鬼呢?别着急,我们一点点来,有点数学基础的人都知道矩阵是二维的,就是有一个MN列,那如果有RegionM的对象指向了RegionN,那就在二维表格的MN列中打一个标记,如图。

image.png

image.png

那我们看到RegionMM就是5指向了RegionNN就是3,那就在53列的地方打个×。那通过这个记录我们就知道哪些Region之间产生了跨代引用。

📝题外话

在原始人那里,主要是因为恐惧,才唤起了宗教的观念。这些恐惧包括对饥饿的恐惧、对野兽的恐惧、对疾病的恐惧以及对死亡的恐惧。由于在这一生存阶段,人们对因果关系的理解通常很低,所以在人类的心里造出一些或多或少与自身相似的虚幻物来,并认为他们害怕的那些事情的发生取决于这些虚幻物的意志和行为。

因此,人们试图通过世代相传的祭祀活动来取悦这些虚幻物,抚慰它们或者让它们对人类产生好感。在这个意义上,我称它为“恐惧宗教”(Furcht-Religion)。这类宗教,尽管不是由某个人创造的,但是一个特殊的祭司阶层已经形成,因而具有相当的稳定性。祭司阶层充当了人与人所怕之物之间沟通的调解者,并以此建立了自己至高无上的地位。在通常情况下,那些依赖于其他因素得以掌权的首领、统治者或者特权阶层,为了巩固其世俗权力,就把这种权力同祭司阶层的职能结合起来。要不就是政治权力的统治者和祭司阶层为了各自的利益而相互结盟。

所以说权力的本质还是基于对人性的窥探。