RMI的分布式垃圾回收

好久以前看过DGC,当时没有记录下来,看到IBM写的简介还不错,特转载。又简单看了一下DGCClient源码,有个疑问:为什么不用WeakReference,而是写一个PhantomReference的子类,然后在子类中引用RefEntry.this? 其实RefEntry中持有的是一个LiveRef的clone,而LiveRef就是PhantomReference的引用对象。

            private class PhantomLiveRef extends PhantomReference {

                public PhantomLiveRef(LiveRef ref) {
                    super(ref, EndpointEntry.this.refQueue);
                }

                public RefEntry getRefEntry() {
                    return RefEntry.this;
                }
            }


补充:这里用PhantomReference确实最合适,因为WeakReference在GC后也一样拿不到被引用对象,所以不能依赖它的get()方法。


以下摘抄自IBM: http://www-01.ibm.com/support/knowledgecenter/SSYKE2_7.0.0/com.ibm.java.aix.71.doc/diag/understanding/rmi_dgc.html?lang=zh-cn

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 请求。



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值