- - PR -
JVMのヒープサイズ拡大方法(Webアプリ:Tomcat)
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 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-12-22 09:53
これがそもそも違うかと。 CATALINA_OPTSでは? | ||||
|
投稿日時: 2005-12-22 10:05
すみません。ここの本文に書き間違えました。
環境変数は CATALINA_OPTS で設定しております。 ご指摘ありがとうございます。 | ||||
|
投稿日時: 2005-12-22 10:52
では、$CATALINA_HOME/bin/catalina.shに
と記述した場合はどうですか? | ||||
|
投稿日時: 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-23 09:11
tomcatを起動するスクリプトの中に、
echo $JAVA_OPTS とやって、 実際に値がセットされているか確認してください。 何も表示されない場合、 起動スクリプトに直に記述してみてください。 | ||||
|
投稿日時: 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