[Seasar-user:13233] Re: [Teeda] @PageScopeを使用するとOutOfMemoryError

Koichi Kobayashi [E-MAIL ADDRESS DELETED]
2008年 3月 11日 (火) 19:00:26 JST


小林 (koichik) です.

Date:    Tue, 11 Mar 2008 14:02:02 +0900
From:    "Tsutomu Uchima" <[E-MAIL ADDRESS DELETED]>
To:      <[E-MAIL ADDRESS DELETED]>
Subject: [Seasar-user:13231] [Teeda] @PageScopeを使用するとOutOfMemoryError

> 添付したソースを実行し何度かsubmitを繰り返すと OutOfMemoryError が発生しま
> す。@PageScope の使い方が間違っているのでしょうか?

ページクラスの中で commons collections の
HashedMap が使われていますが,これが HOT deploy と
相性が悪いようです.

HashedMap を java.util.HashMap に置き換えると
OOME は発生しなくなります.

HOT deploy では,前のリクエストにおける
HotdeployClassLoader でロードされたクラスの
インスタンスを,新しいリクエストにおける
HotdeployClassLoader でロードされたクラスの
インスタンスに置き換えるために,バイト配列に
シリアライズ〜デシリアライズするという操作を
行っています.

詳細には調べてませんが,commons collections の
HashedMap はデシリアライズの際 (?) にバケットの
サイズを倍々に増やしていくようです.
そのため,20 回近くアクセスするとバケットのサイズが
数十 MB に達してしまい,OOME となります.

どうしても commons collectins を使わなくては
ならない理由があるのでしょうか?
もしないなら java.util のコレクションを使うことを
オススメします.


-- 
<component name="koichik">
    <property name="fullName">"Koichi Kobayashi"</property>
    <property name="email">"[E-MAIL ADDRESS DELETED]"</property>
    <property name="blog">"http://d.hatena.ne.jp/koichik"</property>
</component>



Seasar-user メーリングリストの案内