过去十年垃圾回收的总结是什么?

11

我一直在阅读1996年出版的Jones & Lins关于垃圾回收的书。

显然,自那以后,计算机世界发生了巨大变化:多核、乱序芯片带有大缓存,桌面上的主内存甚至更大。世界也基本上为大多数面向消费者的系统选择了x86和ARM微架构。

自开创性的书籍出版以来,最重要的进展是什么?

我特别寻找指向论文、算法、论文等方向的指针,这些方面代表了垃圾收集的理论和实践的进步。


“我特别寻找有关垃圾回收理论和实践方面的论文、算法、学位论文等方面的进展指引。”- 在StackOverflow上询问文献调查(或一般的“研究”)是错误的方式。博士候选人 - 不要效仿这个例子。 - Stephen C
就此而言,我在提出这个问题的时候并不是博士候选人(或任何其他类型的研究人员)。发布日期也很重要——许多年前,StackOverflow是一个外部人可以寻求广泛主题深度知识池的地方。我同意SO不能替代文献调查,但当时“适当”的调查意味着获取(对于那些没有大学隶属关系的人来说并不容易!)并阅读约200篇论文。这完全不同于我的帖子所代表的兴趣和承诺水平。 - Ben Karel
就此而言,像这样的问题从来都不合适放在这里,因为根本不可能充分回答。看看你实际得到的答案吧。在问题打开的3年内......当然......这就是为什么这种方式并不值得去做研究的原因。它行不通。(而且,就此而言,无论你想不想把它称之为研究还是其他什么,你正在做研究。) - Stephen C
我记不清楚了,但我可能添加了那个评论,因为其他一些学生将你的问题作为一个例子,说明这样问问题是“可以”的。老实说,我认为它应该被删除。 - Stephen C
3个回答

3

JVM上的GC进展:

JVM中的G1似乎在桌面上带来了一些新的改进(至少是对于JVM而言)。

G1是一种“服务器风格”的GC,具有以下特点。

并行和并发。G1利用当今硬件中存在的并行性。它使用所有可用的CPU(核心、硬件线程等)来加速其“停止整个世界”的暂停,当应用程序的Java线程停止以启用GC时。它还与正在运行的Java线程同时运行,以最小化在停止整个世界的暂停期间进行全堆操作。

分代。与其他HotSpot GC一样,G1是分代的,意味着它对新分配(称为年轻)的对象和存活一段时间的对象(称为老对象)有不同的处理方式。它集中垃圾回收活动在年轻对象上,因为它们最有可能被回收,同时很少访问旧对象。对于大多数Java应用程序而言,分代垃圾回收比备选方案具有重要的效率优势。

压缩。与CMS不同,G1随着时间的推移执行堆压缩。压缩消除了潜在的碎片问题,以确保平滑和一致的长时间运行。

可预测性。 G1预计比CMS更具可预测性。这主要是由于消除了在CMS中可能会对暂停时间产生负面影响的碎片问题。此外,G1具有暂停预测模型,在许多情况下,它可以经常达到(或很少超过)暂停时间目标。

G1链接

HotSpot 6似乎有许多可供选择的垃圾收集器


我想指出的是,如今JVM不仅适用于Java语言,还适用于其他编程语言,如Scala、Clojure、Python和Ruby。因此,GC的改进不仅仅涉及Java。 - bakkal
并发、分代和压缩垃圾收集算法都早于Jones&Lin。 - Ben Karel

1
据我所知,过去十年垃圾回收技术的大部分进展都是在“实用”方面:算法已知,但就多核系统和观察到的使用模式进行了相当大的调整。这方面的大部分研究都是由 Sun 和 IBM 在 Java 的背景下完成的(令人惊讶的是,Jones和Lins书中介绍的大部分使用模式分析都是关于Lisp及其单向链接列表的;而现今的论文则谈论Java)。Sun的G1算法是建立在Jones和Lins书中所有较旧思路基础之上的——然而Sun公司(现在是Oracle)致力于找出最有效的组合。

此外,还有很多关于分布式垃圾回收的研究——如何管理分散在不同系统上的数据对象,以及如何应对分布式计算中常见的挑战性条件:网络速度慢、节点可能不等同于彼此、某些节点可能会发生故障等。总体结论似乎是它不起作用(有更多的研究而非结果)。引用计数的限定版本(用于引用位于另一系统上的对象)已经被实现(例如在Java的RMI中),并且在不存在跨节点的引用环的情况下似乎可以正常工作。


0

这是我早些时候遇到的东西,现在才想起来:

在Java中实现FPGA感知垃圾回收

在本文中,我们提出了一项新颖的工作,使HW组件能够实际创建和保存对动态分配对象的引用。由于HW组件现在可以持有对象,因此需要让Java垃圾收集器意识到这些对象引用的存在,以便查找仍在使用的所有对象。

PDF论文链接


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