天天看点

完美解决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甚至更多,这样就可以避免内存溢出或大大增加异常的周期(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文件,注意执行的时候将“服务”窗口关闭。

继续阅读