随着系统并发量越来越高,Tomcat 所占用的内存就会越来越大,如果对 Tomcat 的内存管理不当,则可能会引发 Tomcat 内存溢出的问题,那么,如何防止 Tomcat 内存溢出呢?我们今天就来一起探讨下这个问题。
防止 Tomcat 内存溢出可以总结为两个方案:一个是设置 Tomcat 启动的初始内存,一个是防止 Tomcat 所用的 JVM 内存溢出。接下来,我们就分别对这两种方案作出简单的介绍。
设置启动初始内存
其初始空间(即-Xms)是物理内存的 1/64,最大空间(-Xmx)是物理内存的 1/4。可以利用 JVM 提供的-Xmn -Xms -Xmx 等选项可进行设置。
实例
以下给出 1G 内存环境下 java jvm 的参数设置参考:
JAVA_OPTS="-server -Xms800m -Xmx800m -XX:PermSize=64M -XX:MaxNewSize=256m -XX:MaxPermSize=128m -Djava.awt.headless=true "
JAVA_OPTS="-server -Xms768m -Xmx768m -XX:PermSize=128m -XX:MaxPermSize=256m -XX:NewSize=192m -XX:MaxNewSize=384m"
CATALINA_OPTS="-server -Xms768m -Xmx768m -XX:PermSize=128m -XX:MaxPermSize=256m -XX:NewSize=192m -XX:MaxNewSize=384m"
复制代码
Linux
在/usr/local/apache-tomcat-7.0/bin 目录下的 catalina.sh 文件中,添加:JAVA_OPTS='-Xms512m -Xmx1024m',要加“m”说明是 MB,否则就是 KB 了,在启动 tomcat 时会报内存不足。
- -Xms:初始值
- -Xmx:最大值
- -Xmn:最小值
Windows
在 catalina.bat 最前面加入 set JAVA_OPTS=-Xms128m -Xmx350m,如果用 startup.bat 启动 tomcat,OK 设置生效。够成功的分配 200M 内存。但是如果不是执行 startup.bat 启动 tomcat 而是利用 windows 的系统服务启动 tomcat 服务,上面的设置就不生效了,就是说 set JAVA_OPTS=-Xms128m -Xmx350m 没起作用。上面分配 200M 内存就 OOM 了。。windows 服务执行的是 bin\tomcat.exe。它读取注册表中的值,而不是 catalina.bat 的设置。
解决办法
修改注册表
HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Tomcat Service Manager\Tomcat5\Parameters\JavaOptions
复制代码
原值为
-Dcatalina.home="C:\ApacheGroup\Tomcat 7.0"
-Djava.endorsed.dirs="C:\ApacheGroup\Tomcat 7.0\common\endorsed"
-Xrs
复制代码
加入 -Xms300m -Xmx350m 重起 tomcat 服务,设置生效。