- PR -

JSTLのメモリリーク?

投稿者投稿内容
小僧
ぬし
会議室デビュー日: 2002/08/14
投稿数: 526
投稿日時: 2006-10-06 19:52
検証コードに突っ込みいれてしまいました、申し訳ない
ねこたまご
会議室デビュー日: 2006/10/06
投稿数: 6
投稿日時: 2006-10-10 19:05
引用:

nagiseさんの書き込み (2006-10-06 19:36) より:

ほどほどのメモリを食うオブジェクトをforEachするコードを用意して
それを何度か繰り返し呼び出した際にOutOfMemoryが発生するのであれば
forEachタグがオブジェクトをリークしている疑いがでてきますが、
その検証コードでは、検証コードそのものが誤っている疑いが強いと思いますよ。



まず準備として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>タグのメモリリークを証明するものではないですが
念のため報告まで。
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2006-10-10 23:32
引用:

ねこたまごさんの書き込み (2006-10-10 19:05) より:
念のためListオブジェクト作成時のループ回数を変えてみましたが、
finalize()メソッドが呼ばれているオブジェクトの数は<forEach>タグを使用すると
<logic:iterate>タグを使用した場合に比べて必ず一つ少なくなりました。
そして、finalize()メソッドで表示されたオブジェクトIDの中には前回の操作で
生成されたListオブジェクトのIDはありませんでした。

上記の検証も<forEach>タグのメモリリークを証明するものではないですが
念のため報告まで。



なるほどなるほど。
なかなか興味深い話になってきましたね。
最後に<forEach>した際のListがどうも握られっぱなしに
なっているんじゃないか、ということですね?
今度隙を見て、JSTLのソースコードを調べてみますよ。
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2006-10-10 23:43
Bug Databaseを確認したらそのものズバリのバグがありました。
http://issues.apache.org/bugzilla/show_bug.cgi?id=25623
しまったなぁ…。最初にこっちをみておくべきだった。
ねこたまご
会議室デビュー日: 2006/10/06
投稿数: 6
投稿日時: 2006-10-11 09:33
引用:

nagiseさんの書き込み (2006-10-10 23:43) より:
Bug Databaseを確認したらそのものズバリのバグがありました。
http://issues.apache.org/bugzilla/show_bug.cgi?id=25623



nagise様
情報ありがとうございます。
既に報告されていたバグだったんですね(汗
私も最初からここをチェックしていればもっと早く解決できたのにと
反省しきりです。

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