[Seasar-user:20807] [Doma]バージョン1.15.0にてSELECT文解析時にOutOfMemoryErrorが発生

h-kudo [E-MAIL ADDRESS DELETED]
2011年 6月 20日 (月) 14:49:36 JST


お世話になります。
工藤と申します。

現在、以下のプロダクトを利用させていただきWebアプリケーションを開発しております。
s2-framework:2.4.43
s2-extension:2.4.43
s2-tiger:2.4.43
cubby:2.0.9
Doma:1.13.0

本日、以下のようにバージョンアップを実施しまして動作確認を行ったところ
あるSELECT文を実行すると必ずOutOfMemoryErrorが発生してしまうためご報告させていただきます。
(すべてのSELECTではなく特定のSELECTで発生します)
s2-framework:2.4.44
s2-extension:2.4.44
s2-tiger:2.4.44
Doma:1.15.0

S2を2.4.43、Domaが1.15.0の場合にも発生し、
Hotdeploy、Cooldeployモードいずれの場合にも発生します。

Doma:1.14.0の場合は問題なく動作しております。

あるSELECT文というのは今のところ1つのみで以下の特徴があります。
(heapdumpのレポートを見て関連してそうなところをPickup)
・SelectOptionsを使用してページングを実施
・条件コメントが比較的多い
 
ifブロックが全部で31、うちネストしている個所が3か所で最大ネスト数は2

動作確認を実施した環境は以下の通りです。
JDK:1.6.0_21
Tomcat: 6.0.21 (-XX:MaxPermSize=256m, -XX:PermSize=256m)
OS:WindowsXP SP3
DB:Oracle 11g

発生時のログ
----
java.lang.OutOfMemoryError: Java heap space
	at java.util.ArrayList.<init>(ArrayList.java:112)
	at java.util.ArrayList.<init>(ArrayList.java:119)
	at
org.seasar.doma.internal.jdbc.sql.node.AbstractSqlNode.<init>(AbstractSqlNode.java:30)
	at
org.seasar.doma.internal.jdbc.sql.node.BindVariableNode.<init>(BindVariableNode.java:38)
	at
org.seasar.doma.internal.jdbc.sql.node.BindVariableNode.copy(BindVariableNode.java:59)
	at
org.seasar.doma.internal.jdbc.sql.node.BindVariableNode.copy(BindVariableNode.java:25)
	at
org.seasar.doma.internal.jdbc.sql.node.LogicalOperatorNode.copy(LogicalOperatorNode.java:46)
	at
org.seasar.doma.internal.jdbc.sql.node.LogicalOperatorNode.copy(LogicalOperatorNode.java:26)
	at org.seasar.doma.internal.jdbc.sql.node.IfNode.copy(IfNode.java:60)
	at
org.seasar.doma.internal.jdbc.sql.node.IfBlockNode.copy(IfBlockNode.java:100)
	at
org.seasar.doma.internal.jdbc.sql.node.IfBlockNode.copy(IfBlockNode.java:30)
	at org.seasar.doma.internal.jdbc.sql.node.EndNode.copy(EndNode.java:43)
	at
org.seasar.doma.internal.jdbc.sql.node.IfBlockNode.copy(IfBlockNode.java:109)
	at
org.seasar.doma.internal.jdbc.sql.node.IfBlockNode.copy(IfBlockNode.java:30)
	at org.seasar.doma.internal.jdbc.sql.node.EndNode.copy(EndNode.java:43)
	at org.seasar.doma.internal.jdbc.sql.node.EndNode.copy(EndNode.java:26)
	at
org.seasar.doma.internal.jdbc.sql.node.IfBlockNode.copy(IfBlockNode.java:112)
	at
org.seasar.doma.internal.jdbc.sql.node.IfBlockNode.copy(IfBlockNode.java:30)
	at org.seasar.doma.internal.jdbc.sql.node.EndNode.copy(EndNode.java:43)
	at org.seasar.doma.internal.jdbc.sql.node.EndNode.copy(EndNode.java:26)
	at
org.seasar.doma.internal.jdbc.sql.node.IfBlockNode.copy(IfBlockNode.java:112)
	at
org.seasar.doma.internal.jdbc.sql.node.IfBlockNode.copy(IfBlockNode.java:30)
	at org.seasar.doma.internal.jdbc.sql.node.EndNode.copy(EndNode.java:43)
	at
org.seasar.doma.internal.jdbc.sql.node.IfBlockNode.copy(IfBlockNode.java:109)
	at
org.seasar.doma.internal.jdbc.sql.node.IfBlockNode.copy(IfBlockNode.java:30)
	at org.seasar.doma.internal.jdbc.sql.node.EndNode.copy(EndNode.java:43)
	at org.seasar.doma.internal.jdbc.sql.node.EndNode.copy(EndNode.java:26)
	at
org.seasar.doma.internal.jdbc.sql.node.IfBlockNode.copy(IfBlockNode.java:112)
	at
org.seasar.doma.internal.jdbc.sql.node.IfBlockNode.copy(IfBlockNode.java:30)
	at org.seasar.doma.internal.jdbc.sql.node.EndNode.copy(EndNode.java:43)
	at
org.seasar.doma.internal.jdbc.sql.node.IfBlockNode.copy(IfBlockNode.java:109)
	at
org.seasar.doma.internal.jdbc.sql.node.IfBlockNode.copy(IfBlockNode.java:30)
Exception in thread "Seasar2-TimeoutManager" java.lang.OutOfMemoryError:
Java heap space
	at java.util.AbstractList.iterator(AbstractList.java:273)
	at org.seasar.extension.timer.TimeoutManager.run(TimeoutManager.java:142)
	at java.lang.Thread.run(Thread.java:619)
----
heapdumpの結果からは
org.seasar.doma.internal.jdbc.sql.node.IfBlockNodeというクラスがメモリ中の8割を占めている状態でした。

より詳細な情報が必要でしたら
heapdumpのレポートファイル等を添付いたしますので
お手数ではございますが送付先をご連絡いただければと思います。

以上です。
---
h-kudo <[E-MAIL ADDRESS DELETED]>


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