Java的:垃圾收集RMI目标对象?(Java: garbage collection for RM

2019-09-23 13:43发布

虽然得到我的手脏RMI,我得到了一个java.rmi.NoSuchObjectException例外,这使我这个问题: java.rmi.NoSuchObjectException:表中没有这样的对象 ,但我的问题是不同的

我在我的主要方法,因此在主线程创建IMPL对象。 如果我这样做:

FooImpl fi = new FooImpl();
foo = (Foo) UnicastRemoteObject.exportObject(fi, 0);

事情做工精细。

如果我这样做:

foo = (Foo) UnicastRemoteObject.exportObject(new FooImpl(), 0);

我看到FooImpl实例收集,然后我得到的上述异常。

foo是我initializng在主静态参考; 和另一个远程对象返回foo从它的方法之一。 因此,一个客户端获取远程对象,然后再获取foo从它,然后调用一个方法foo ,这时候我得到的异常如上所述。 那么,为什么它发生这种方式?

编辑:这是我的主要方法

public static void main(String[] args) throws RemoteException, AlreadyBoundException 
{

    Server server = new Server();
    Hello stub = (Hello) UnicastRemoteObject.exportObject(server, 0);

    FooImpl fi = new FooImpl();
    foo = (Foo) UnicastRemoteObject.exportObject(fi, 0);

    Registry registry = LocateRegistry.getRegistry();
    registry.bind("Hello", stub);       
    System.out.println("Server ready!");        
}

在客户端,我越来越hello ,并呼吁它的方法,它给了我foo ,然后调用一个方法foo

EDIT2:如果我使用

Hello stub = (Hello) UnicastRemoteObject.exportObject(new Server(), 0);

并结合foohello ,然后同样的异常被抛出时,我尝试访问hello ,因为现在它的这是越来越收集Server实例。 很奇怪的东西!

Answer 1:

这两种方法都可能会失败。 有一个在变量范围的方面他们之间没有真正的区别。

更通常在这种情况下看到的问题是注册表本身,当创建LocateRegistry.createRegistry()您都没有做。 如果你是,所创建的注册表本身可以过GC'd:你必须保持Registry在一个静态变量引用。 然后,它会不会是GC'd,它会阻止存根foo被GC'd,和尾将保持FooImpl被DGC'd,因此GC'd。

你的情况,你会过得更好保持在静态变量的远程对象的引用(服务器,而不是存根)。



文章来源: Java: garbage collection for RMI target object?