JVM内存溢出常见的有一下两种:
第一种:java.lang.OutOfMemoryError: PermGen space
第二种:java.lang.OutOfMemoryError: Java heap space
第一种异常原因是因为我们项目中需要加载的文件太多所导致,项目发布时class文件和jar文件会被加载到jvm的永久区,当永久区空间不足时则会抛出 java.lang.OutOfMemoryError: PermGen space;
第二种为堆栈溢出,此异常在项目运行其产生,由于运行期产生太多的对象实例而没有被gc,所以才会抛出该异常;
针对以上两种异常,和Tomcat使用情况的不同,有如下三种解决方案:
1 、Tomcat解压版 通过startup.bat脚本运行:
当我们通过startup.bat运行tomcat时,需要记事本catalina.bat并找到
echo Using CATALINA_BASE: "%CATALINA_BASE%"该行,
然后在上面添加
set JAVA_OPTS=%JAVA_OPTS% -server -Xms100m -Xmx1024m -XX:PermSize=20m -XX:MaxPermSize=100m
并将参数设置合理值。
2. Tomcat解压版 注册为系统服务
解压版注册为系统服务方式为,cmd 进入tomcat/bin目录然后执行service.bat install 服务名称;
当你下载的解压文件中没有service.bat请到官网重新下载,你可能不会遇到该问题,但我遇到了!
此时我们可以打开系统服务管理界面看到我们注册成功的tomcat服务
如上图我注册的系统服务为:tomcat9090,此时我们就可以在此关闭和启动tomcat服务,并可以设置为开机自启;
如果服务注册成功却无法启动,如:
或者错误代码为1;
请查看Tomcat logs日志,开发中看日志,和记录日志至关重要。
无法启动可能有一下原因:
2.1,也是网上挺多的:将JDK中BIN下的 msvcr71.dll 复制到 TOMCAT 中的 BIN 下(没有解决问题)
2.2,检查jdk版本是否太低
2.3,查看jdk和tomcat是否都是32位或64位,当两者位数不同是通过startup.bat脚本是可以启动,但当注册为系统服务时是无 法启动的,当然tomcat安装版也一样,要使用位数相同,且版本更新时间相近;
2.4,当tomcat服务可以启动,但在启动过程中停止,请查看logs日志,此时最大可能为PermGen space,解决方案为
2.4.1:
卸载服务:cmd 进入tomcat/bin目录然后执行service.bat uninstall 服务名称;
然后打开service.bat文件找到
--JvmOptions "-Dcatalina.home=%CATALINA_HOME%;.................E%\conf\logging.properties"并在尾部添加
-XX:PermSize=20m;-XX:MaxPermSize=100m参数之间以“;”相隔
如:“...............conf\logging.properties;-XX:PermSize=20m;-XX:MaxPermSize=100m"参数值按个人所需设定;
并设置下列两个参数:
--JvmMs 128 ^
--JvmMx 1024
以上设置完成后请重新注册系统服务;
2.4.2:打开注册表
HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Procrun 2.0\Tomcat9090\Parameters\Java
Options右击,修改,添加-XX:PermSize=20m;-XX:MaxPermSize=100m
如图:
然后重启服务;
3.Tomcat 安装版,如出现无法安装,或无法启动等问题请参考2.2至2.4解决方案;
JVM内存参数说明请参考官网:
http://tomcat.apache.org/tomcat-7.0-doc/windows-service-howto.html
累屁了,回家吃饭。。。。。