情況有點複雜。 我有一個Web容器,它使用RMI控制另一臺機器上的另一個應用程序。 RMI服務器端有一個HashMap,其中包含Web應用程序端需要控制的用戶信息。確保Java對象被破壞
當用戶從Web應用程序端註銷時,會有RMI調用RMI服務器,告訴服務器註銷用戶。然後我只是刪除HashMap中的項目。
現在我意識到GC不會收集我在HashMap中刪除的對象,因爲其他線程仍在使用它,並且該對象還包含一些子對象,如用戶聯繫人。
我真的不知道如何摧毀整個對象,包括它的屬性和屬性的屬性。
情況有點複雜。 我有一個Web容器,它使用RMI控制另一臺機器上的另一個應用程序。 RMI服務器端有一個HashMap,其中包含Web應用程序端需要控制的用戶信息。確保Java對象被破壞
當用戶從Web應用程序端註銷時,會有RMI調用RMI服務器,告訴服務器註銷用戶。然後我只是刪除HashMap中的項目。
現在我意識到GC不會收集我在HashMap中刪除的對象,因爲其他線程仍在使用它,並且該對象還包含一些子對象,如用戶聯繫人。
我真的不知道如何摧毀整個對象,包括它的屬性和屬性的屬性。
那麼,你必須刪除所有hard references到你的對象,使其有資格進行垃圾回收。沒有其他出路。什麼是其他線程在你的情況?
如果這是分佈式垃圾收集(即客戶端對服務器上存在的對象有遠程引用),該系統通過讓服務器跟蹤哪些客戶端請求訪問遠程對象在服務器上。當進行引用時,服務器將該對象標記爲「髒」,並且當客戶端丟棄該引用時,它將被標記爲「乾淨」。
在這些情況下,如果客戶端沒有定期通知服務器對象仍在使用中,服務器會在一段時間後自動收集它們。
刪除所有硬引用不是一件容易的工作在我的情況。其他線程意味着我使用mutil線程來處理用戶有效載荷的一部分,不同的有效載荷使用不同的線程。每個用戶都有它的線程。 – Shisoft 2012-03-09 10:30:24
那麼,你應該能夠停止線程處理剛剛註銷的用戶的數據。讓你的線程失去控制並不是一個好主意 - 你正在以用戶的方式跟蹤他們,不是嗎? – 2012-03-09 10:32:21
並非總是......我知道該怎麼做,謝謝。但有什麼辦法可以獲得對象的硬引用嗎? – Shisoft 2012-03-09 10:45:02