关于RMI理论,我有两个答案。
1)让我们来看一下:
Service impl = new Service();假设服务是远程接口的实现,并且它扩展了UniCastRemoteObject;
如果(服务器端)我用上面的代码创建了impl,然后调用:
impl.f();为了执行f(),JVM使用存根?换句话说,f()将作为远程方法被调用吗?
2)我正在寻找分布式垃圾收集,我已经实现了unreference方法来查看与远程对象关联的计数器何时变为零,它工作得很好。我也实现了finalize方法,但是这个方法从来没有被调用过,你能解释一下为什么吗?我还尝试解除绑定远程引用UnicastRemoteObject.unexportObject(impl,true);但是没有调用finalize。
谢谢
问候
发布于 2013-07-15 05:26:34
来执行f(),JVM使用存根?换句话说,f()将作为远程方法被调用吗?
不是的。但如果您通过服务器的存根执行它,它将通过RMI执行。没有短路。
我也实现了finalize方法,但是这个方法从来没有被调用过,你能解释一下为什么吗?
因为该对象没有在本地被垃圾收集。除了通过RMI客户端之外,您可能还有另一个对它的引用。DGC会释放RMI对对象的引用,但不会释放您自己的引用。所有引用都必须被释放,才能发生本地GC,即使是它们也不能保证它会发生。
发布于 2013-07-15 01:41:26
1)不,当您在本地与远程对象对话时,这不会通过存根进行。通常,只有在从RMI注册表检索对象时,或者在另一个远程调用中获得引用时,才会插入存根。
2)我不太了解所使用的算法,但RMI确实有分布式垃圾收集,应该注意释放未使用的对象。但就像任何垃圾收集一样,如果引用计数为零,这并不意味着对象将自动被垃圾收集。这通常只在系统需要释放内存时发生,而在应用程序的生命周期中可能永远不会发生这种情况。
https://stackoverflow.com/questions/17641837
复制相似问题