案例
我在服务器进程中使用进程内* Java RMI注册表。
我在注册表中绑定了一个对象。
我的客户端进程连接并查找绑定,并传递远程对象。
现在我希望服务器进程干净地关闭,即不再存在deamon-threads。使用RMI,我在服务器进程中的一个对象上调用“close”,问题是这个“关闭”方法实际上必须做什么。
问题
如何确保在使用RMI导出对象的进程中没有运行非守护程序线程?
据我所知,我必须取消导出** JVM关闭的所有导出对象?由于许多对象已经通过RMI传递,我将不得不维护这些对象的集合和每个对象的展开。
我已经读过,任何导出的对象都应该在垃圾收集器(现在找不到引用)时自动导出,但是我的经验告诉我,某些对象(特别是distrubuted?)可能需要很长时间才能被垃圾收集所以这不是一个真正的选择。
*使用LocateRegistry创建 **使用UnicastRemoteObject
执行Unexport答案 0 :(得分:0)
如何确保在使用RMI导出对象的进程中没有运行非守护程序线程?
全部取消导出,包括注册表。请注意,这需要保存createRegistry().
据我所知,我必须取消导出** JVM关闭的所有导出对象?由于许多对象已经通过RMI传递,我将不得不维护这些对象的集合和每个对象的展开。
正确,除非您使用Unreferenced
设施。
我已经读过,任何导出的对象都应该在收集垃圾时自动取消(现在找不到引用)但是我的经验告诉我,某些对象(尤其是分布式的?)可能需要很长时间才能被垃圾收集所以这不是一个真正的选择。
您可以控制所有DGC超时。它确实是一个选项,通过Unreferenced
界面。