竹形誠司 ブログ
Java+MySQL+Tomcat    »トピック一覧
掲示板へのスパムが多いため、「ご質問」のコーナーはユーザー登録制とさせていただきました。お手数ですが、上の「新規ユーザーの登録」メニューより登録をお願いします。
帳票Web
アプリケーション

受注開発始めました
詳しくは こちら
竹形 誠司 著/ラトルズ刊
JSP帳票アプリケーション実践開発入門
JSP帳票アプリケーション
実践開発入門

JSP業務アプリケーション短期開発入門
JSP業務アプリケーション
短期開発入門

Java+MySQL+Tomcatで始めるWebアプリケーション構築入門
Java+MySQL+Tomcatで始めるWebアプリケーション構築入門

Java+MySQL+Tomcatで作る掲示板とブログ
Java+MySQL+Tomcatで作る
掲示板とブログ
Tomcatがメモリを大食いする場合の対処
by 竹形 誠司[takegata]
OSの環境にもよりますが、メモリにあまり余裕のない環境でTomcatを運用していると、残りのメモリが足りなくなってTomcatを再起動できなくなったり、ひどいときにはOSの動作に支障を来たすこともあります。

こういった不具合が生じた場合は、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というスクリプトがあれば、それを実行する」という処理です。

そこで、次のような内容のsetenv.shを作って実行権を付与しました。

#!/bin/sh
export CATALINA_OPTS="-server -Xmx64M"
ところがうまくいきません。どこかで「英数字以外の文字が使用されています。」というエラーが出ているようです。さらにいろいろ調べた結果、SolarisのBシェル(/bin/sh)では

export NAME=value
という書式が使えないことが分かりました。次のように変数の定義とexport文を分けて書く必要があるそうです。

NAME=value
export NAME
昔からUNIXを使っている人には常識のようですが、これが分からずに相当ハマってしまいました。で、setenv.shを次のように修正したらうまくいっている感じです。

#!/bin/sh
CATALINA_OPTS="-server -Xmx64M"
export CATALINA_OPTS
もしかしたら export する必要は無いのかも知れません。これについてはまだちょっとよく調べてみないと分かりません。

この設定が本当に有効になっているかどうかを確認するために、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 がセットされていることが確認できました。


投稿:竹形 誠司[takegata]/2008年 11月 17日 12時 40分 /更新:2008年 11月 17日 12時 40分