2012-03-09 10 views
3

状況は少し複雑です。 私は、RMIを使って別のマシンの別のアプリケーションを制御するWebコンテナを持っています。 RMIサーバー側には、Webアプリケーション側が制御する必要があるユーザー情報を含むHashMapがあります。Javaオブジェクトが確実に破壊されるようにする

ユーザーがWebアプリケーション側からログアウトすると、RMIサーバーへのRMI呼び出しがあり、ユーザーにログアウトするようにサーバーに指示します。次に、HashMap内の項目を削除します。

これで、HashMapで削除したオブジェクトがGCによって収集されないことがわかりました。これは、他のスレッドがまだそれを使用していて、オブジェクトにユーザーの連絡先などのサブオブジェクトも含まれているからです。

オブジェクトのプロパティとプロパティのプロパティを含むオブジェクト全体をどのように破壊するのか、実際にはわかりません。

答えて

3

まあ、ガベージコレクションの対象にするには、オブジェクトにすべてhard referencesを削除する必要があります。他の方法はありません。あなたのケースでは他のスレッドとは何ですか?

+0

すべてのハードリファレンスを削除するのは簡単ではありません。他のスレッドは、ユーザーのペイロードの一部を処理するためにmutilスレッドを使用し、別のペイロードが異なるスレッドを使用することを意味します。 – Shisoft

+0

さて、ログアウトしたばかりのユーザーのデータを処理するスレッドを停止することができます。あなたのスレッドを制御不能にすることは良い考えではありません。あなたはそれらをすべてユーザ側で追跡していますか? –

+0

いつも...私は何をすべきかを知っています、ありがとうございます。しかし、オブジェクトのハードリファレンスを得る方法はありますか? – Shisoft

3

これは、分散ガーベジコレクションの場合(つまり、クライアントがサーバー上に存在するオブジェクトへのリモート参照を持つ)の場合、このシステムは、実行中のリモートオブジェクトへのアクセスを要求したクライアントサーバー上で参照が行われると、サーバーはオブジェクトを「ダーティー」とマークし、クライアントが参照をドロップすると、オブジェクトを「クリーン」としてマークします。

このような場合、クライアントがオブジェクトがまだ使用中であることをサーバーに定期的に通知しない場合、サーバーは一定期間後に自動的にガベージコレクトを行う必要があります。

関連する問題