使用进程内Java RMI注册表时如何很好地关闭

eve*_*tic 5 java client distributed rmi server

案件

我在服务器进程中使用进程内* Java RMI 注册表。

我在注册表中绑定了 1 个对象。

我的客户端进程连接并查找绑定和传递的远程对象。

现在我希望服务器进程完全关闭,即不应存在更多守护线程。使用 RMI,我在服务器进程中的一个对象上调用“close”,问题是这个“close”方法实际上必须做什么。

问题

如何确保使用 RMI 导出对象的进程中没有运行非守护线程?

据我所知,我必须取消导出**所有导出的对象才能关闭 JVM?由于许多对象已通过 RMI 传递,因此我必须维护这组对象并取消导出**每个对象。

我读过任何导出的对象在垃圾收集时都应该取消导出自身(现在找不到引用),但我的经验告诉我,某些对象(尤其是分布的?)可能需要很长时间才能被垃圾收集,所以这是不是一个真正的选择。

* 使用LocateRegistry创建 ** Unexport 使用UnicastRemoteObject
执行

use*_*421 0

如何确保使用 RMI 导出对象的进程中没有运行非守护线程?

全部取消导出,包括注册表。请注意,这需要保存返回值createRegistry().

据我所知,我必须取消导出**所有导出的对象才能关闭 JVM?由于许多对象已通过 RMI 传递,因此我必须维护这组对象并取消导出**每个对象。

正确,除非您使用该Unreferenced设施。

我读过任何导出的对象在垃圾收集时都应该取消导出自身(现在找不到引用),但我的经验告诉我,某些对象(特别是分布式?)可能需要很长时间才能被垃圾收集,所以这是不是一个真正的选择。

您可以控制所有 DGC 超时。这确实是一个选项,通过Unreferenced界面。