2012-03-09 88 views
3

情况有点复杂。 我有一个Web容器,它使用RMI控制另一台机器上的另一个应用程序。 RMI服务器端有一个HashMap,其中包含Web应用程序端需要控制的用户信息。确保Java对象被破坏

当用户从Web应用程序端注销时,会有RMI调用RMI服务器,告诉服务器注销用户。然后我只是删除HashMap中的项目。

现在我意识到GC不会收集我在HashMap中删除的对象,因为其他线程仍在使用它,并且该对象还包含一些子对象,如用户联系人。

我真的不知道如何摧毁整个对象,包括它的属性和属性的属性。

回答

3

那么,你必须删除所有hard references到你的对象,使其有资格进行垃圾回收。没有其他出路。什么是其他线程在你的情况?

+0

删除所有硬引用不是一件容易的工作在我的情况。其他线程意味着我使用mutil线程来处理用户有效载荷的一部分,不同的有效载荷使用不同的线程。每个用户都有它的线程。 – Shisoft 2012-03-09 10:30:24

+0

那么,你应该能够停止线程处理刚刚注销的用户的数据。让你的线程失去控制并不是一个好主意 - 你正在以用户的方式跟踪他们,不是吗? – 2012-03-09 10:32:21

+0

并非总是......我知道该怎么做,谢谢。但有什么办法可以获得对象的硬引用吗? – Shisoft 2012-03-09 10:45:02

3

如果这是分布式垃圾收集(即客户端对服务器上存在的对象有远程引用),该系统通过让服务器跟踪哪些客户端请求访问远程对象在服务器上。当进行引用时,服务器将该对象标记为“脏”,并且当客户端丢弃该引用时,它将被标记为“干净”。

在这些情况下,如果客户端没有定期通知服务器对象仍在使用中,服务器会在一段时间后自动收集它们。