情况有点复杂。 我有一个Web容器,使用RMI控制另一台机器中的另一个应用程序。 RMI服务器端有一个HashMap,其中包含Web应用程序端需要控制的用户信息。
当用户从Web应用程序端注销时,将向RMI服务器发出RMI调用,告知服务器注销用户。然后我只删除HashMap中的项目。
现在我意识到GC不会收集我在HashMap中删除的对象,因为可能其他线程仍在使用它,并且该对象还包含一些子对象,例如用户联系人。
我真的不知道如何销毁整个对象,包括它的属性和属性。
答案 0 :(得分:3)
好吧,您必须删除对象的所有hard references才能使其符合垃圾回收的条件。没有其他出路。在你的情况下,其他线程是什么?
答案 1 :(得分:3)
如果这是分布式垃圾收集的情况(即客户端具有对服务器上存在的对象的远程引用),则该系统通过让服务器跟踪哪些客户端请求访问在其上运行的远程对象来工作。服务器。在进行引用时,服务器将对象标记为“脏”,当客户端删除引用时,它被标记为“干净”。
在这些情况下,如果客户端没有定期通知服务器对象仍在使用中,服务器应该在一段时间后自动对其进行垃圾回收。