2012-03-10 16 views
2

Javaで、私のアプリケーションがEJBとしてデプロイされた状態で、glassfishのようなアプリケーションサーバーで動作しているとき。 EJBをアンデプロイすると、メモリにロードされたsigletoneクラスがどうなりますか?私はそこに存在するコンテナを再起動してガベージコレクションを行うまでは理解していますが、いつどこで実行されるのかわからないので、ejbをもう一度デプロイすると、jvmの古いオブジェクトを取り戻すことができます ?アプリケーションが終了するとオブジェクトに何が起こるか

答えて

2

配備された各アプリケーションには、独自の別のクラスローダーがロードされます。クラスローダはクラスのアイデンティティの一部であるため、異なるインスタンスが互いに干渉することなく、同じクラスを複数回(異なるコンフィグレーションで)読み込むことができます。

これにより、アプリケーションサーバー内のさまざまなアプリケーションが互いに効果的に分離され、同じアプリケーションを2度並行して実行することもできます。

アプリケーションがアンデプロイされると、そのオブジェクトへの参照が残っていなければ、すべてのオブジェクト(クラスローダーを含むクラス自体)がガベージコレクトされます。残念ながら、参照は一部のシステムクラスに残り、ガベージコレクションを防止することができます。これはclassloader leakと呼ばれます。

+0

OKクラスローダーのリークを言うとき、それは既知の問題であることを意味しますか?アプリケーションはまだ展開されていませんが、 GC、そして一度私はもう一度アプリをデパイすると、私のシングルトンは再び作り直されるのではなく、再利用されるでしょうか? –

+0

@Loner shushman:いいえ、クラスは再利用されません(再デプロイされたアプリケーションは新しいクラスローダーを取得します)。しかし、メモリを占有してしまい、最終的には多数の再デプロイメントの後にアプリケーションサーバーがメモリ不足になります。 –

+0

OKだから、シングルトンであってもクラスは再利用されませんか?私が求めているのは、シングルトンクラスを持っているからです。彼らはまだJVMにいると信じており、シャットダウンメカニズムを使ってJVMからそれらをアンロードしていますが、オブジェクトは使用されていません –

0

ガベージコレクションは任意の時間に実行され、制御できません。 Javaのガベージコレクタは古いオブジェクトを再利用できますが、これは当てはまりません。配備を解除すると、シングルトンは破棄されます。展開すると、新しいものが作成されます。

+0

ごめんなさいGCが古いオブジェクトを再利用できるということを理解できませんでした。私の質問は次のようなものだと思います。アプリケーションをアンデプロイするとシングルトンが破壊されることが予想されますが、何らかの理由でJVMが再起動されていないためシングルトンはJVMに残っています。そして、このsingletoneに送信された特定のコマンドがありませんでした。 –

関連する問題