首页 理论教育分布式数据库技术分布垃圾收集

分布式数据库技术分布垃圾收集

【摘要】:然而,由参考完整性约束指定的级联更新则是一种“人工”垃圾收集的简单形式。在大部分通用操作系统或程序设计语言里,人工垃圾收集不是很成功。因此,分布式基于对象系统的通用性要求能自动收集垃圾。增量垃圾收集的主要困难是,收集器跟踪对象图,程序活跃度会更改对象图的其他部分。分布垃圾收集依赖于分布引证计数或分布跟踪。

对象的优点是,对象可以通过对象标识指向其他对象。当程序修改对象和除去参考时,当没有参考指向它时,持久对象可以变得无法从系统根部抵达,这样的对象就是垃圾,应当由垃圾收集器来重新分配。关系型DBMS里,无需自动进行垃圾收集,因为对象参考是靠连接值(join value)来支持的。然而,由参考完整性约束指定的级联更新则是一种“人工”垃圾收集的简单形式。在大部分通用操作系统或程序设计语言里,人工垃圾收集不是很成功。因此,分布式基于对象系统的通用性要求能自动收集垃圾。

基本垃圾收集算法可以分为参考计数(reference counting)或基于追踪(tracing-based)两种。

在参考计数系统里,每个对象有一个参考它的相关计数。每次由程序创建一个附加的指向对象的引证后,就把该对象的计数器加一。当现有的指向对象的引证取消时,计数器就减一。对象占用的内存在该对象计数归零时收回(此时该对象已为垃圾)。

基于追踪收集器可以分为标记和清扫(mark and sweep)收集器算法与基于拷贝(copybased)收集器算法。标记和清扫收集器是两阶段算法。第一阶段是标记(mark)阶段,从根开始对每个可到达的对象作标记(例如,为每个对象设置一个比特)。这个标记也称颜色(color),收集器将能到达的对象作标记,检查内存,将无标记的对象清除,这就是清扫(sweep)阶段。

基于拷贝(copy-based)收集器将存储器分为两个不相交的区域:源空间(from-space)和目的空间(to-space)。程序在目的空间有空余空间时操控源空间里的对象。与标记和清扫收集器算法不同,这里采用复制收集器里源空间里对象拷贝(一般来用深度优先方法)的手段,考虑从根到达目的空间的对象。一旦所有对象都复制好,收集过程结束,源空间里的内容都清掉,源空间和目的空间的角色就交换了。复制对象过程是线性进行的,可以将存储器紧凑化。(www.chuimin.cn)

标记和清扫收集器算法和基于拷贝收集器算法的基本实现采用的是一种休克方法(stopthe-world),即用户应用程序在整个周期都挂起。对大多数应用程序来说,不能使用休克方法,因为它们有破坏性。为了保持用户应用程序的响应时间,要求使用额外的增量技术,并只关注变化部分。增量垃圾收集的主要困难是,收集器跟踪对象图,程序活跃度会更改对象图的其他部分。在有些情况下,收集器可能失去某些可到达对象的踪迹,产生差错,影响回收。

分布垃圾收集比集中式垃圾收集要难得多。为了可伸缩性和有效性,分布式系统的垃圾收集器将每个节点上的收集器和全局的节点间收集器(inter-site collector)组合到一起。注意,要协调本地收集和全局收集很困难,因为要求小心跟踪节点间交换的引证的轨迹。为此,保留每次交换的轨迹是必要的,但要注意对象可能从几个节点来引证。此外,放在节点上的对象也可以被远程节点上的活跃的对象所引用。这样,对象不能为本地收集器所回收,因为它是从一个远程节点的根到达的。在分布式环境里,消息可能丢失、重复或延迟,也可能某个节点被损坏,因此要跟踪节点间的引证很困难。

分布垃圾收集依赖于分布引证计数或分布跟踪。分布引证计数会有两方面的问题。首先,引证计数不能收集不可到达的垃圾对象环,即互相引证的垃圾对象。其次,引证计数会被公共信息故障破坏,即如果消息没有按其因果序可靠传递,那么维持引证计数不变会成为一个问题。目前有些算法使用相应的基于引证计数方法的分布垃圾收集算法。每种解决方案关于故障模型有特定的假设,因此是不完整的。这些方面还值得学术界继续深入探索和研究。