- - PR -
セッションの上書き
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2008-12-09 16:02
Servletでの動作で疑問があります。
session.setAttribute("KEY",object1); でセッションスコープにメモリーを割り当てたクラス(object1)をセットし session.setAttribute("KEY",object2); 同じセッションキーに異なるクラス(object2)をセットした場合 object1のメモリーは開放の対象になりきちんと破棄されているのでしょうか? 私は破棄されているものと思い使用していましたが ふと疑問に思いました。 破棄されていると思うのですが核心が持てません、よろしくお願いします。 | ||||
|
投稿日時: 2008-12-09 16:05
それだけではなんとも言えないでしょう。
object1は他では全く利用されてないんでしょうか? | ||||
|
投稿日時: 2008-12-09 16:39
必ずしもGCによって呼ばれる保証はないので何ともいえないのですが、
Object#finalizeメソッドをオーバーライドして、 ログを出してみるとよいかもしれません。 | ||||
|
投稿日時: 2008-12-09 17:21
ありがとうございます。
mioさん 使用方法ですが ServletでJSPの表示項目用Beanを作成し、全てのServletは同じセッションキーに Beanを設定しJSP側で参照しています。 かつのりさん finalizeメソッドを実装してみたところ 不規則ですがfinalizeメソッドは実行されているようです。 なぜこのような質問をしているかというと セッションスコープの上書きでメモリーリークを起こさないか心配しています。 finalizeメソッドのログはしばらく様子を見てみようと思います。 | ||||
|
投稿日時: 2008-12-09 18:35
sessionに設定しただけでメモリリークが起きるなら、世界中で問題が起きてそうな…。
例えば他のとこでMapに格納されてるだとか、そういうことがないかということです。 Servletでsetしてjspでgetしてるだけなら(requestスコープでは足りないのかというのはさておき)、その後どこかで解放されるでしょう。 gc自体定期的に実行されるわけではありませんし、参照を付け替えた何秒後には消える、とは決められないですね。 | ||||
|
投稿日時: 2008-12-09 19:38
セッションスコープということよりも、
HttpSessionの実装がどうなっているかが重要です。 手元のTomcatのソースを見ましたが、(5.5.17) StandardSessionのsetAttributeを見ると、 参照をHashtable以外で持ち続けることはなさそうです。 つまりリークするならば、別で参照を持つなど、他の要因となります。 | ||||
|
投稿日時: 2008-12-10 13:14
>sessionに設定しただけでメモリリークが起きるなら、世界中で問題が起きてそうな…。
確かにそうですね・・・ >(requestスコープでは足りないのかというのはさておき) 基本requestなんですけど一部sessionを使用している所があります。 >gc自体定期的に実行されるわけではありません ログをみてみると不規則ながら全て破棄は行われているようです安心しました。 >参照をHashtable以外で持ち続けることはなさそうです。 Hashtableは使用してないです。安心しました。 そこまで見ていただけてありがとうございます。 かつのりさん、mioさんありがとうございます。 問題ないということで解決しました。 当然と思っていることでも突き詰めて行く事で勉強になりました。 | ||||
|
投稿日時: 2008-12-10 14:23
Tomcatのセッションの実装は、StandardSessionの中でHashtableを使っていて、 それ以外で参照を保持することはないという意味で書きました。 アプリの中でHashtableを使っている・・・云々の話ではありません。 |
1