3

关于 RMI 理论,我有两个答案。

1)让我们看一下:

Service impl = new Service();

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

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

impl.f();

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

2)我在寻找分布式垃圾收集,我已经实现了 unreference 方法来查看与远程对象关联的计数器何时变为零,它工作正常。我也实现了 finalize 方法,但是从来没有调用过,你能解释一下为什么吗?我还尝试取消绑定远程引用 UnicastRemoteObject.unexportObject(impl,true); 但 finalize 不会被调用。

谢谢

问候

4

2 回答 2

2

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

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

我也实现了 finalize 方法,但是从来没有调用过,你能解释一下为什么吗?

因为该对象没有在本地进行垃圾收集。除了通过 RMI 客户端之外,您可能还有其他对它的引用。DGC 释放RMI对对象的引用,但不会释放您自己的。必须释放所有引用才能发生本地 GC,即使它们也不能保证它会发生。

于 2013-07-14T21:26:34.043 回答
1

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

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

于 2013-07-14T17:41:25.847 回答