OSの環境にもよりますが、メモリにあまり余裕のない環境でTomcatを運用していると、残りのメモリが足りなくなってTomcatを再起動できなくなったり、ひどいときにはOSの動作に支障を来たすこともあります。
こういった不具合が生じた場合は、Javaの起動オプション Xmx でTomcatが使うメモリ(ヒープ)の上限を設定します。Tomcatは、環境変数CATALINA_OPTSでJavaの起動オプションを受け取るようになっているので、ヒープの上限を64Mバイトに設定する場合はこんな感じになります(UNIX系OSの場合)。
そこで、次のような内容のsetenv.shを作って実行権を付与しました。
この設定が本当に有効になっているかどうかを確認するために、Tomcatが動いている環境の環境変数を一覧表示するJSPスクリプトを書いてみました。こんな感じです。
こういった不具合が生じた場合は、Javaの起動オプション Xmx でTomcatが使うメモリ(ヒープ)の上限を設定します。Tomcatは、環境変数CATALINA_OPTSでJavaの起動オプションを受け取るようになっているので、ヒープの上限を64Mバイトに設定する場合はこんな感じになります(UNIX系OSの場合)。
export CATALINA_OPTS="-Xmx64M"
問題はこれをどこに書くかです。いろいろ調べてみましたが、tomcat/binにsetenv.shというファイルを作って、そこに書くと良いようです。Tomcat起動時にstartup.shから呼び出されるcatalina.shに次のような部分があります。if [ -r "$CATALINA_BASE"/bin/setenv.sh ]; then
. "$CATALINA_BASE"/bin/setenv.sh
elif [ -r "$CATALINA_HOME"/bin/setenv.sh ]; then
. "$CATALINA_HOME"/bin/setenv.sh
fi
これは「binディレクトリにsetenv.shというスクリプトがあれば、それを実行する」という処理です。. "$CATALINA_BASE"/bin/setenv.sh
elif [ -r "$CATALINA_HOME"/bin/setenv.sh ]; then
. "$CATALINA_HOME"/bin/setenv.sh
fi
そこで、次のような内容のsetenv.shを作って実行権を付与しました。
#!/bin/sh
export CATALINA_OPTS="-server -Xmx64M"
ところがうまくいきません。どこかで「英数字以外の文字が使用されています。」というエラーが出ているようです。さらにいろいろ調べた結果、SolarisのBシェル(/bin/sh)ではexport CATALINA_OPTS="-server -Xmx64M"
export NAME=value
という書式が使えないことが分かりました。次のように変数の定義とexport文を分けて書く必要があるそうです。NAME=value
export NAME
昔からUNIXを使っている人には常識のようですが、これが分からずに相当ハマってしまいました。で、setenv.shを次のように修正したらうまくいっている感じです。export NAME
#!/bin/sh
CATALINA_OPTS="-server -Xmx64M"
export CATALINA_OPTS
もしかしたら export する必要は無いのかも知れません。これについてはまだちょっとよく調べてみないと分かりません。CATALINA_OPTS="-server -Xmx64M"
export CATALINA_OPTS
この設定が本当に有効になっているかどうかを確認するために、Tomcatが動いている環境の環境変数を一覧表示するJSPスクリプトを書いてみました。こんな感じです。
<%@ page contentType="text/html; charset=utf-8"%>
<%@ page import="java.util.Map"%>
<%
Map<String,String> map = System.getenv();
for(Map.Entry<String,String> entry:map.entrySet() ){
%>
<%=entry.getKey()%>:
<%=entry.getValue()%>
<BR>
<%}%>
これで CATALINA_OPTS に -server -Xmx64M がセットされていることが確認できました。<%@ page import="java.util.Map"%>
<%
Map<String,String> map = System.getenv();
for(Map.Entry<String,String> entry:map.entrySet() ){
%>
<%=entry.getKey()%>:
<%=entry.getValue()%>
<BR>
<%}%>
投稿:竹形 誠司[takegata]/2008年 11月 17日 12時 40分
/更新:2008年 11月 17日 12時 40分