tomcat常见的3种内存溢出(二)

2014-11-23 22:59:06 · 作者: · 浏览: 1
catalina.bat,在“echo "Using CATALINA_BASE:$CATALINA_BASE"”上面加入以下行:

Java代码

setJAVA_OPTS=%JAVA_OPTS% -server -Xms800m-Xmx800m -XX:MaxNewSize=256m

注:JAVA_OPTS是保留先前设置。

Linux服务器:

修改TOMCAT_HOME/bin/catalina.sh

在“echo "Using CATALINA_BASE:$CATALINA_BASE"”上面加入以下行:

JAVA_OPTS="$JAVA_OPTS-server -Xms800m-Xmx800m -XX:MaxNewSize=256m"

注:$JAVA_OPTS是保留先前设置。

-------------------解决方案3:-----------------------------

前提:是执行windows的系统服务启动tomcat的方式

但是如果不是执行startup.bat启动tomcat而是利用windows的系统服务启动tomcat服务,上面的设置就不生效了,

就是说set JAVA_OPTS=-Xms128m -Xmx350m没起作用.上面分配200M内存就OOM了..

windows服务执行的是bin\tomcat.exe.他读取注册表中的值,而不是catalina.bat的设置.

解决办法:

修改注册表HKEY_LOCAL_MACHINE\SOFTWARE\Apache SoftwareFoundation\Tomcat Service Manager\Tomcat5\Parameters\JavaOptions

原值为

-Dcatalina.home="C:\ApacheGroup\Tomcat5.0"

-Djava.endorsed.dirs="C:\ApacheGroup\Tomcat5.0\common\endorsed"

-Xrs

加入 -Xms300m-Xmx350m

重起tomcat服务,设置生效

-------------------解决方案4:-----------------------------

前提:是执行windows的系统服务启动tomcat的方式

在安 tomcat 若有勾 "NT Service(NT/2000/XPonly)"
安 完成後在安 目 的"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文件,注意执行的时候将“服务”窗口关闭。

第二种:永久保存区域溢出
 原因分析:

PermGenspace的全称是PermanentGeneration space,是指内存的永久保存区域,这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGen space中,它和存放类实例(Instance)的Heap区域不同,GC(GarbageCollection)不会在主程序运行期对PermGen space进行清理,所以如果你的应用中有很CLASS的话,就很可能出现PermGen space错误,这种错误常见在web服务器对JSP进行pre compile的时候。如果你的WEB APP下都用了大量的第三方jar, 其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了。但目前的hibernate和spring项目中也很容易出现这样的问题。可能是由于这些框架会动态class,而且jvm的gc是不会清理PemGen space的,超过了jvm默认的大小(4M),导致内存溢出。
  建议:将相同的第三方jar文件移置到tomcat/shared/lib目录下,这样可以达到减少jar 文档重复占用内存的目的。

这一个一般是加大-XX:PermSize-XX:MaxPermSize 来解决问题。
  -XX:PermSize 永久保存区域初始大小
  -XX:PermSize 永久保存区域初始最大值
  这一般结合第一条使用,比如 set JAVA_OPTS=-Xms1024m -Xmx1024m -XX:PermSize=128M-XX:PermSize=256M
  有一点需要注意:java -Xmx***Mversion 命令来测试的最大堆内存是 -Xmx与 -XX:PermSize的和 比如系统支持最大的jvm堆大小事1.5G,那 -Xmx1024m-XX:PermSize=768M 是无法运行的。

-----------------解决方案1:-------------------------

Linux服务器:

在catalina.sh的第一行增加:

JAVA_OPTS=

-Xms64m

-Xmx256m

-XX:PermSize=128M

-XX:MaxNewSize=256m

-XX:MaxPermSize=256m

或者

在“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行:
JAVA_OPTS="-server -XX:PermSize=64M-XX:MaxPermSize=128m

Windows服务器:

在catalina.bat的第一行增加:

setJAVA_OPTS=-Xms64m-Xmx256m -XX