- PR -

JVMのヒープサイズ拡大方法(Webアプリ:Tomcat)

1
投稿者投稿内容
未記入
ベテラン
会議室デビュー日: 2005/04/16
投稿数: 51
投稿日時: 2005-12-22 09:07
次のような環境で開発とテストを行っています。
Webアプリで利用するJVMのヒープサイズを拡大したいのですが
上手くいっていません。何かアドバイスをお願いいたします。

--------------------------------------------------------------------
OS : Mac OS X Server
AP SERVER : Tomcat 4.1.29
FRAMEWORK : Jetspeed 1.5_ja_2
DB : PostgreSQL 8.0
IDE : Eclipse 3.0.2
--------------------------------------------------------------------

あるクラスは、最初にSQL(SELECT)を発行し、
かなり巨大な結果セットを取得します。
処理はその結果セットの各行について(while(ResultSet.next())、
順に行われます。

結果セットの巨大さ故、
javaコマンドに次のようにオプションをつけ
最大ヒープサイズを拡張したりしています。

-Xms1024m -Xmx1024m

これを付けないと、OutOfMemoryErrorが出てしまうのです。

CUIでテストを行っていたときは
Eclipse上から実行していたので
その場合、「Run...」>「Java Application」>[Arguments]タブ
にて VM arguments を指定していました。


ところで、
そのクラスを含むJarファイルを作成し
それを TOMCAT_HOME/webapps/jetspeed-japan/WEB-INF/lib 内に入れ、
Webアプリからこのクラスを起動します。

アプリケーションサーバとしてTOMCAT、
フレームワークとしてjetspeedを利用しており
JSPのあるボタン(submit)が押下されるとサーブレットが呼出され
そのサーブレットが lib 内に格納されたJarファイルに含まれる
上述のクラスを呼び出して実行しています。

ここで問題となるのは、このとき利用されているJVMに対して
最大ヒープサイズの拡張を伝えるにはどうすればよいかということです。

Tomcatで実行しているのでTomcatが利用しているJVMに対して
この指示を出せばよいのだと思い、調べたところ
CATALINA_HOMEという環境変数で上述のパラメータを指定すればよいらしい
と認識しました。

そこで、/etc/bashrc にこの環境変数を設定しました。
setコマンドで確かめると確かに環境変数は常に有効になっています。

しかし、実際Tomcatを起動しJetspeedのそのポートレット(JSP)から
そのボタンを押下するとこの処理が終了しません。
システムエラーなどになるわけではありませんが
DBのCPU使用率が数%の低い値でずっと推移しており処理が終わらないのです。
ps -aux でプロセスを確認すると
SELECTコマンドが挙がっていました。
このPIDをkillすると処理は終了しました。


長くなりましたが、この環境でJVMのヒープサイズを拡大することにより
Webアプリでも当該処理を正常終了させるには
どうすべきか知りたく思っています。
よろしくお願い申し上げます。
ハツキタツミ
大ベテラン
会議室デビュー日: 2005/05/24
投稿数: 108
投稿日時: 2005-12-22 09:53
引用:

未記入さんの書き込み (2005-12-22 09:07) より:

Tomcatで実行しているのでTomcatが利用しているJVMに対して
この指示を出せばよいのだと思い、調べたところ
CATALINA_HOMEという環境変数で上述のパラメータを指定すればよいらしい
と認識しました。



これがそもそも違うかと。
CATALINA_OPTSでは?
未記入
ベテラン
会議室デビュー日: 2005/04/16
投稿数: 51
投稿日時: 2005-12-22 10:05
すみません。ここの本文に書き間違えました。
環境変数は CATALINA_OPTS で設定しております。

ご指摘ありがとうございます。
ハツキタツミ
大ベテラン
会議室デビュー日: 2005/05/24
投稿数: 108
投稿日時: 2005-12-22 10:52
では、$CATALINA_HOME/bin/catalina.shに
コード:
JAVA_OPTS="-Xms1024m -Xmx1024m "


と記述した場合はどうですか?
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2005-12-22 12:37
1.java.sql.Connection#createStatement(int resultSetType, int resultSetConcurrency)
で、
定数:java.sql.ResultSet.TYPE_FORWARD_ONLYと、
定数:java.sql.ResultSet.FETCH_FORWARD
を使用するようにしてステートメントを取得する。

2.結果セットを読み込んでオブジェクト等に保持しない

等の対策があると思います。

メモリ増設・設定変更を行ったところで、
運用時にデータ件数が増えるたびに再設定しなければならず、
ただの一時凌ぎでしかないでしょう。

根本的な解決を行う為には、レコードの量に関係なく動かなければいけません。
けそらそら
会議室デビュー日: 2005/12/19
投稿数: 12
お住まい・勤務地: 高円寺に住みたい
投稿日時: 2005-12-23 09:11
tomcatを起動するスクリプトの中に、
echo $JAVA_OPTS とやって、
実際に値がセットされているか確認してください。
何も表示されない場合、
起動スクリプトに直に記述してみてください。
未記入
ベテラン
会議室デビュー日: 2005/04/16
投稿数: 51
投稿日時: 2005-12-26 12:05
多くのご指南を賜りまして本当にどうもありがとうございました。

結果なのですが、
TOMCAT全体の設定としてCATALINA_OPTSを適用させたい場合、
最初に記載した方法、
つまり /etc/bashrc に環境変数CATALINA_OPTSを記入する方法でOKでした。

次に、この長大な結果セットを取得する処理は
あるPostgreSQLユーザにて実行されていました。
このユーザはUnix上のユーザではなくMac上のユーザとして存在しているため
NetInfoマネージャを利用して
/users/[USER_NAME] のプロパティ(CATALINA_OPTS)を新規作成する方法でもOKでした。


多分、このように環境変数として設定しても
Tomcatを起動するスクリプト内でセットしても
同じく適用されるのだと思いました。


ちなみに、
CATALINA_OPTSとJAVA_OPTSと2つありますが、
catalina.sh のコメントに書かれている文章はどちらも全く同じ(下記)で
何が違うのか、わかりません。よろしければ教えてください。

<CATALINA_OPTSとJAVA_OPTSのコメント>

(Optional) Java runtime options used when the "start",
"stop", or "run" command is executed.


《追記》
どの方法を取るにせよ、かつのり様が仰っているように
コードレベルで工夫すべきかもしれません。
この処理は異様に長い時間がかかっていることもあり
今後の課題です。

これからもよろしくお願いいたします。
1

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