[Seasar-user:21409] Re: テーブルの全データをselectすると、OutOfMemoryErrorが発生する

Hiroyuki Ohnaka [E-MAIL ADDRESS DELETED]
2012年 8月 17日 (金) 23:56:36 JST


大中(せと)です。

> selectの実行は上記メソッド内のexecuteで行われていると思われます。
> execute実行前後のメモリ使用量をログに出力して確認すると、
> テーブルから取得した全データサイズ以上にメモリを消費しているように
> 見受けられました。

Daoメソッドの返り値が配列もしくはListの場合、
S2DaoはResultSetの結果をjava.util.ArrayList に詰め替えています。

ResultSetが返す結果が大量になった場合、
ArrayList が内部で確保している配列の領域を越えてしまうので、
領域の再確保が行われます。

この時、ArrayList内部で配列のインスタンス生成が頻繁に行われるため、
全データサイズ以上にメモリを消費しているように見えるのではないかと
思われます。


2012年8月17日 13:25 Toshiya Fukushima <fukushima @ techmatrix.co.jp>:
> 初めて投稿します。よろしくお願いいたします。
>
> 早速ですが、質問させて頂きます。
> 下記の現象で困っております。
> 原因がわかる方いらっしゃましたら、ご教授願いいたします。
>
> -----
> ■現象・状況
> あるテーブルの全データ10万件程をselectすると、
> メモリ使用量が急激に増加して「OutOfMemoryError」が発生します。
>
> ■詳細・解析内容
> S2DaoInterceptor#invoke(MethodInvocation)
>
> selectの実行は上記メソッド内のexecuteで行われていると思われます。
> execute実行前後のメモリ使用量をログに出力して確認すると、
> テーブルから取得した全データサイズ以上にメモリを消費しているように
> 見受けられました。
>
> ■環境
> Tomcat6.0.35:最大ヒープサイズ1GB
> あるテーブルの全データサイズ:128MB
> -----
>
> select実行後、結果取得の部分において、メモリを消費するような
> 処理が行われていたりするのでしょうか。
> (少量のデータであれば問題ないが、大量のデータを取得すると
>  問題があるなど。)
>
> ※そもそもテーブルの全データを取得するSQLが実行されてしまう
>  というアプリ上の問題は別途確認していますが、select実行後に
>  メモリを大量に消費してしまう原因は知りたいと考えております。
>
> 以上、よろしくお願いいたします。
> _______________________________________________
> Seasar-user mailing list
> Seasar-user @ ml.seasar.org
> https://ml.seasar.org/mailman/listinfo/seasar-user


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