解决tomcat内存溢出问题

Tomcat是目前应用十分广泛的一个Java servlet container与web服务器,反正5年来我是从4.0.6一直用到5.5.9,期间也出现过几次崩溃抛出类似hs_err_pid31199.log的log,不过绝大部分时间是运行平稳的。但java.lang.OutOfMemoryError的异常相信真正用过tomcat的人都遇到过,抛开程序问题不谈(使用Borland的optimizeit可以查找,代码中可能有本应短期存在的obj,但是却被一个长生命期的ref引用着,因此gc无法回收这个obj。多半跟静态对象有关),这个异常和JVM默认划分的内存上限是128M有关,如果你的业务足够繁忙,128M是远远不过的,好在现在的内存几乎达到了白菜价(到今天大概1G是 260元),一般的服务器都有2-4G的内存,所以你可以大方的给JVM分配上1G甚至更多,这样就可以避免内存溢出或大大增加异常的周期。

1、linux下简单,在bin里找到catalina.sh,vi一下,紧跟着注释的后面增加一句:

JAVA_OPTS='-Xms256m -Xmx256m'

256是个例子,你可以根据物理内存情况写成1024甚至2048,不过个人建议有1024足够足够用了。

:wq后,重启tomcat即可,ps ax后看到tomcat的进程会变成类似

/opt/jdk1.6.0/bin/java -Xms256m -Xmx256m -Djava.endorsed.dirs=/opt/tomcat/common/e

2、在windows下,如果使用控制台的方式,也就是直接执行startup.bat方式启动,可以通过修改catalina.bat

set JAVA_OPTS=-Xms256m -Xmx512m

注意,linux下有单引号,win下不用,如果加上单引号,tomcat根本起不来。

3、如果windows下tomcat被作为一种服务安装了,修改jvm的可用内存会有些麻烦,不过咱这也可以完美解决。

在安裝tomcat時若有勾選"NT Service(NT/2000/XP only)"
則安裝完成後在安裝目錄的"bin"目錄裡會有一個tomcat.exe的檔案
先把tomcat的服務停掉
在命令列模式下(运行里输入CMD)
將目錄切換到tomcat的bin目錄
用下面的命令把服務移除
tomcat -uninstall "Apache Tomcat 4.1"

接下來,写个批处理。

內容如下
set SERVICENAME=Apache Tomcat 4.1
set CATALINA_HOME=E:\Tomcat 4.1.24
set CLASSPATH=D:\j2sdk1.4.1_01\lib
set JAVACLASSPATH=%CLASSPATH%
set JAVACLASSPATH=%JAVACLASSPATH%;%CATALINA_HOME%\bin\bootstrap.jar
set JAVACLASSPATH=%JAVACLASSPATH%;%CATALINA_HOME%\common\lib\servlet.jar
set JAVACLASSPATH=%JAVACLASSPATH%;%JAVA_HOME%\lib\tools.jar
tomcat.exe -install "%SERVICENAME%" "%JAVA_HOME%\jre\bin\server\jvm.dll" -Djava.class.path="%JAVACLASSPATH%" -Dcatalina.home="%CATALINA_HOME%" -Xms512m -Xmx768m -start org.apache.catalina.startup.Bootstrap -params start -stop org.apache.catalina.startup.Bootstrap -params stop -out "%CATALINA_HOME%\logs\stdout.log" -err "%CATALINA_HOME%\logs\stderr.log"

注意,从tomcat.exe -install开始的是最后一行!不要手工回车换行把这一行分成了好几段。保存后在命令行下执行这个bat文件,注意执行的时候将“服务”窗口关闭。

如果执行结果如下图,那么恭喜,一个可以使用大内存的tomcat服务诞生了。

如果启动新服务的时候遇到“服务无法启动,遇到一个内部问题”云云,很可能是JDK有问题,我遇到过一次,手工到“环境变量”中(我想装 tomcat的起码都是老鸟了吧,你会找不到环境变量设置的位置?)在系统变量里增加JAVA_HOME,变量值写真实的jDK路径,然后重新卸载 tomcat服务,重装tomcat服务,一般就没问题了。