RMI理论 - 存根和分布式垃圾收集

时间:2013-07-14 17:32:33

标签: java garbage-collection rmi

我对RMI理论有两个答案。

1)让我们来看看:

Service impl = new Service();

假设Service是远程接口的实现并且它扩展了UniCastRemoteObject;

如果(服务器端)我使用上面的代码创建impl,然后调用:

impl.f();

要执行f(),JVM使用存根?换句话说,f()将被称为远程方法?

2)我正在寻找分布式垃圾收集,我已经实现了非参考方法,以查看与远程对象关联的计数器何时变为零,它工作正常。 我已经实现了finalize方法,但是从未调用过,你能解释一下原因吗? 我也尝试解除绑定远程引用UnicastRemoteObject.unexportObject(impl,true);但最终确定不会被调用。

由于

此致

2 个答案:

答案 0 :(得分:2)

  

要执行f(),JVM使用存根?换句话说,f()将被称为远程方法?

没有。但是如果你通过服务器上的存根执行它,它将通过RMI。没有短路。

  

我已经实现了finalize方法,但是从未调用过,你能解释一下原因吗?

因为该对象未在本地进行垃圾收集。您可以通过RMI客户端另外引用它。 DGC发布 RMI对该对象的引用,但它不会发布您自己的引用。 必须发布所有引用才能使本地GC发生,即使它们也无法保证它会发生。

答案 1 :(得分:1)

1)不,当你在本地与远程对象交谈时,这不会通过存根。如果从RMI注册表中检索对象,或者在另一个远程调用中获得引用,则通常仅插入存根。

2)我不太了解所使用的算法,但RMI确实有分布式垃圾收集,应该处理释放未使用的对象。但就像任何垃圾收集一样,如果引用计数变为零,那并不意味着该对象将自动被垃圾收集。这通常只发生在系统需要释放内存时,并且在应用程序的生命周期中可能永远不会出现这种情况。