JVM内存溢出常见的有一下两种:html
第一种:java.lang.OutOfMemoryError: PermGen spacejava
第二种:java.lang.OutOfMemoryError: Java heap spaceapache
第一种异常缘由是由于咱们项目中须要加载的文件太多所致使,项目发布时class文件和jar文件会被加载到jvm的永久区,当永久区空间不足时则会抛出 java.lang.OutOfMemoryError: PermGen space;windows
第二种为堆栈溢出,此异常在项目运行其产生,因为运行期产生太多的对象实例而没有被gc,因此才会抛出该异常;tomcat
针对以上两种异常,和Tomcat使用状况的不一样,有以下三种解决方案:jvm
1 、Tomcat解压版 经过startup.bat脚本运行:spa
当咱们经过startup.bat运行tomcat时,须要记事本catalina.bat并找到日志
echo Using CATALINA_BASE: "%CATALINA_BASE%"该行,server
而后在上面添加htm
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
累屁了,回家吃饭。。。。。