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

Toshihiro Nakamura [E-MAIL ADDRESS DELETED]
2011年 6月 20日 (月) 15:26:49 JST


中村(taedium)です。

> あるSELECT文というのは今のところ1つのみで以下の特徴があります。
> (heapdumpのレポートを見て関連してそうなところをPickup)
> ・SelectOptionsを使用してページングを実施
> ・条件コメントが比較的多い

SQLファイルを見せてもらえないでしょうか?
テーブル名、カラム名、バインド変数名などは
見られてもいいように変更してください。
ただし、私が見たいポイントはSQL文の構造なので、
SQLのキーワード、コメント、改行の位置など
は変えないようにお願いします。

また、SelectOptionsへの設定内容も教えてください。

> お世話になります。
> 工藤と申します。
> 
> 現在、以下のプロダクトを利用させていただき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 mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-user

-- 
Toshihiro Nakamura <[E-MAIL ADDRESS DELETED]>



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