了解分布式垃圾回收

RMI 子系统实现基于引用计数的“分布式垃圾回收”(DGC),以便为远程服务器对象提供自动内存管理设施。

当客户机创建(序列化)远程引用时,会在服务器端 DGC 上调用 dirty()。 当客户机完成远程引用后,它会调用对应的 clean() 方法。

针对远程对象的引用由持有该引用的客户机租用一段时间。 租期从收到 dirty() 调用开始。 在此类租约到期之前,客户机必须通过对远程引用额外调用 dirty() 来更新租约。 如果客户机不在租约到期前进行续签,那么分布式垃圾收集器会假设客户机不再引用远程对象。

DGCClient 可实现 RMI 分布式垃圾回收系统的客户机端。 DGCClient 的外部接口是 registerRefs() 方法。 当远程对象的 LiveRef 进入 JVM 时,它必须向 DGCClient 注册以参与分布式垃圾回收。 当注册针对特定远程对象的第一个 LiveRef 时,会对远程对象的服务器端 DGC 调用 dirty()。 该调用会返回租约,保证服务器端 DGC 在特定时间不会回收远程对象。 如果存在针对特定服务器上的远程对象的 LiveRef 实例,那么 DGCClient 会定期发送更多的 dirty 调用以续签其租约。 DGCClient 将使用虚引用来跟踪已注册 LiveRef 实例的本地可用性。 在本地对特定远程对象的 LiveRef 实例进行垃圾回收时,将对服务器端 DGC 调用 clean()。 该调用表明服务器不需要为此客户机保持活动的远程对象。 RenewCleanThread 将通过续签租约并进行 clean 调用来处理异步客户机端 DGC 活动。 因此,此线程将一直等待,直至下一次续签租约,或直至有任何虚引用排队以根据需要生成 clean 请求。