2017-10-31 9 views
0

サーブレットコンテナの寿命中にこの特定の状態が不思議でした。サーブレットコンテナがサーブレット(クラス)をロードするために割り当てられたメモリがあるとします。特定の時間にメモリがいっぱいになり、コンテナが新しいサーブレットをロードする必要があります。この状態では、ロードされたコンテナがどんなアルゴリズムでも取り出されます(これを共有することができれば嬉しいです)。そして、必要なサーブレットに置き換えられます。ここで何が起こりますか? destroyメソッドは呼ばれていますか?好奇心の背後にある理由は、置き換えられたサーブレットが再びロードされるとき、2回目と呼ばれるinit()メソッドですか?メモリからロードされたサーブレットを強制的にアンロードする方法| Tomcat

答えて

0

サーブレットは、メモリがいっぱいであるためにメモリからアンロードされません。実際には、Servletオブジェクトは通常、小さなものであり、サーブレットによって処理される要求/応答オブジェクトに状態が完全に格納されているため、通常はメンバー変数がありません。通常、各サーブレットのインスタンスはいつでも1つしか割り当てられません。

これは基本的に残りの質問を無効にします。サーブレットは、Webアプリケーションのデプロイが解除されたときにのみアンロードされます。それが起こると、確かにdestroyが呼び出されます。しかし、OutOfMemoryの状態では、通常は何もできません(ガベージコレクションできるものはすべて収集されます)ので、メモリが残っていないときはdestroyが呼び出されることに依存することはできません。しかし、あなたはそれを推測したでしょう。メモリがなくなったら、さらに多くのオブジェクトを初期化するためのスペースがないので、追加のinitはもう呼び出されません。

Webアプリケーションを再デプロイすると、アンデプロイメントサーブレットでdestroyが呼び出され、新しくデプロイされたサーブレットを初めて使用する前にinitが呼び出されます。

どのオブジェクトが解放されるかを決定するアルゴリズムは、ガベージコレクタのアルゴリズム(設定可能)です。しかし、それはしばらく使用されていないランダムサーブレットではなく、未使用( "ガベージ"、 "参照されていない")オブジェクトを収集するだけです。

関連する問題