- - PR -
JSTLのメモリリーク?
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2006-10-06 19:52
検証コードに突っ込みいれてしまいました、申し訳ない
| ||||
|
投稿日時: 2006-10-10 19:05
まず準備としてMemTestListクラスのコンストラクタ、finalize()メソッド内に System.identityHashCode(this)を出力するprint文を入れて オブジェクトのID(のようなもの)を確認できるようにしました。 ここからが本題ですが、 検証コード内のListオブジェクトを作成しているforループのループ回数を 10分の1程度に減らして、ブラウザ上のボタンを押下 -> リストの中身表示 の動作を何度か繰り返して検証を行ってみました。 === <forEach>タグの代わりに<logic:iterate>タグを使った場合 == 特定の回数(私の環境では17回でしたが)押下 -> 表示を繰り返すと Listオブジェクト生成開始のprint文が表示された後、 finalize()メソッドに追加したprint文が16個表示されました。 この時、finalize()メソッド内から出力されたオブジェクトIDは 1回目〜16回目の操作の時に生成されたListオブジェクトのIDでした。 その後Listオブジェクト生成完了のprint文が表示されました。 === <forEach>タグを使った場合 == 特定の回数(私の環境では17回でしたが)押下 -> 表示を繰り返すと Listオブジェクト生成開始のprint文が表示された後、 finalize()メソッドに追加したprint文が15個表示されました。 この時、finalize()メソッド内から出力されたオブジェクトIDは 1回目〜15回目の操作の時に生成されたListオブジェクトのIDでした。 その後Listオブジェクト生成完了のprint文が表示されました。 OutOfMemoryError自体は発生しなくなりましたが、上記の挙動は一連の動作を 何度か繰り返しても回数も含めて再現しました。 念のためListオブジェクト作成時のループ回数を変えてみましたが、 finalize()メソッドが呼ばれているオブジェクトの数は<forEach>タグを使用すると <logic:iterate>タグを使用した場合に比べて必ず一つ少なくなりました。 そして、finalize()メソッドで表示されたオブジェクトIDの中には前回の操作で 生成されたListオブジェクトのIDはありませんでした。 上記の検証も<forEach>タグのメモリリークを証明するものではないですが 念のため報告まで。 | ||||
|
投稿日時: 2006-10-10 23:32
なるほどなるほど。 なかなか興味深い話になってきましたね。 最後に<forEach>した際のListがどうも握られっぱなしに なっているんじゃないか、ということですね? 今度隙を見て、JSTLのソースコードを調べてみますよ。 | ||||
|
投稿日時: 2006-10-10 23:43
Bug Databaseを確認したらそのものズバリのバグがありました。
http://issues.apache.org/bugzilla/show_bug.cgi?id=25623 しまったなぁ…。最初にこっちをみておくべきだった。 | ||||
|
投稿日時: 2006-10-11 09:33
nagise様 情報ありがとうございます。 既に報告されていたバグだったんですね(汗 私も最初からここをチェックしていればもっと早く解決できたのにと 反省しきりです。 |