【问题标题】:RMI theory - Stub and Distributed Garbage CollectionRMI 理论 - 存根和分布式垃圾收集
【发布时间】:2013-07-12 14:02:57
【问题描述】:

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

1) 我们来看看:

Service impl = new Service();

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

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

impl.f();

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

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

谢谢

问候

【问题讨论】:

    标签: java garbage-collection rmi


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 那么,可能是RMIregistry持有对远程对象的引用,导致GC无法释放内存?
      • RMI 注册表将只包含对您明确放入其中的对象的引用。对象永远不会被隐式插入。
      • 当我调用 Naming.rebind() 时,我明确地放入了它
      • @Edge7 如果 RMI Registry 持有引用,则 DGC 引用计数不能为零。
      猜你喜欢
      • 1970-01-01
      • 2012-11-30
      • 1970-01-01
      • 2018-05-10
      • 2011-04-25
      • 2012-04-08
      • 1970-01-01
      • 2012-12-28
      • 2012-01-18
      相关资源
      最近更新 更多