- PR -

セッションの上書き

1
投稿者投稿内容
ジン
ベテラン
会議室デビュー日: 2007/07/27
投稿数: 52
投稿日時: 2008-12-09 16:02
Servletでの動作で疑問があります。

session.setAttribute("KEY",object1);
でセッションスコープにメモリーを割り当てたクラス(object1)をセットし

session.setAttribute("KEY",object2);
同じセッションキーに異なるクラス(object2)をセットした場合

object1のメモリーは開放の対象になりきちんと破棄されているのでしょうか?
私は破棄されているものと思い使用していましたが
ふと疑問に思いました。

破棄されていると思うのですが核心が持てません、よろしくお願いします。
mio
ぬし
会議室デビュー日: 2005/08/25
投稿数: 734
お住まい・勤務地: 神奈川県
投稿日時: 2008-12-09 16:05
それだけではなんとも言えないでしょう。
object1は他では全く利用されてないんでしょうか?
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2008-12-09 16:39
必ずしもGCによって呼ばれる保証はないので何ともいえないのですが、
Object#finalizeメソッドをオーバーライドして、
ログを出してみるとよいかもしれません。
ジン
ベテラン
会議室デビュー日: 2007/07/27
投稿数: 52
投稿日時: 2008-12-09 17:21
ありがとうございます。

mioさん

使用方法ですが
ServletでJSPの表示項目用Beanを作成し、全てのServletは同じセッションキーに
Beanを設定しJSP側で参照しています。

かつのりさん
finalizeメソッドを実装してみたところ
不規則ですがfinalizeメソッドは実行されているようです。

なぜこのような質問をしているかというと
セッションスコープの上書きでメモリーリークを起こさないか心配しています。
finalizeメソッドのログはしばらく様子を見てみようと思います。
mio
ぬし
会議室デビュー日: 2005/08/25
投稿数: 734
お住まい・勤務地: 神奈川県
投稿日時: 2008-12-09 18:35
sessionに設定しただけでメモリリークが起きるなら、世界中で問題が起きてそうな…。

例えば他のとこでMapに格納されてるだとか、そういうことがないかということです。
Servletでsetしてjspでgetしてるだけなら(requestスコープでは足りないのかというのはさておき)、その後どこかで解放されるでしょう。

gc自体定期的に実行されるわけではありませんし、参照を付け替えた何秒後には消える、とは決められないですね。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2008-12-09 19:38
セッションスコープということよりも、
HttpSessionの実装がどうなっているかが重要です。

手元のTomcatのソースを見ましたが、(5.5.17)
StandardSessionのsetAttributeを見ると、
参照をHashtable以外で持ち続けることはなさそうです。

つまりリークするならば、別で参照を持つなど、他の要因となります。
ジン
ベテラン
会議室デビュー日: 2007/07/27
投稿数: 52
投稿日時: 2008-12-10 13:14
>sessionに設定しただけでメモリリークが起きるなら、世界中で問題が起きてそうな…。
確かにそうですね・・・

>(requestスコープでは足りないのかというのはさておき)
基本requestなんですけど一部sessionを使用している所があります。

>gc自体定期的に実行されるわけではありません
ログをみてみると不規則ながら全て破棄は行われているようです安心しました。

>参照をHashtable以外で持ち続けることはなさそうです。
Hashtableは使用してないです。安心しました。
そこまで見ていただけてありがとうございます。

かつのりさん、mioさんありがとうございます。
問題ないということで解決しました。
当然と思っていることでも突き詰めて行く事で勉強になりました。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2008-12-10 14:23
引用:

>参照をHashtable以外で持ち続けることはなさそうです。
Hashtableは使用してないです。安心しました。
そこまで見ていただけてありがとうございます。


Tomcatのセッションの実装は、StandardSessionの中でHashtableを使っていて、
それ以外で参照を保持することはないという意味で書きました。
アプリの中でHashtableを使っている・・・云々の話ではありません。
1

スキルアップ/キャリアアップ(JOB@IT)