了解过jvm的人都知道,java程序是在jvm中运行的,jvm中堆,栈,有方法区等模块,因此一个几百M的程序启动在jvm中肯定是出现如下异常信息:
- tomcat:java.lang.OutOfMemoryError: PermGen space
- tomcat:java.lang.OutOfMemoryError: Java heap space
- weblogic:Root cause of ServletException java.lang.OutOfMemoryError
- resin:java.lang.OutOfMemoryError
- java:java.lang.OutOfMemoryError
接下来根据笔者的经验,在我的开发中遇到这类问题的解决方案。
一、使用eclipse解决内存异常的问题
用eclipse开发的时候,通常在eclipse中添加tomcat容器,此时eclipse会和tomcat有一个软关联,通过eclipse来可以设置tomcat的端口号,虚拟路径,存储位置,设置容器的堆栈内存。
在红框里面添加如下参数配置:
-Xms1024m
-Xmx1024m
-XX:PermSize=128M
-XX:MaxPermSize=256m
-XX:MaxNewSize=256m
参数说明:xms 最小堆 xmx最大堆 permsize持久层
二、使用tomcat容器解决内存异常的问题
在实际部署过程中,可能只能在tomcat中部署项目,通过把项目打包成war的方式,直接放在tomcat中的webapp目录下,容器启动后并会自动解压。此时遇到内衬异常的时候,解决方案如下:
在TOMCAT_HOME/bin/catalina.sh(以linux中的tomcat为例)中找到:
rem ----- Execute The Requested Command ---------------------------------------
echo Using CATALINA_BASE: "%CATALINA_BASE%"
echo Using CATALINA_HOME: "%CATALINA_HOME%"
echo Using CATALINA_TMPDIR: "%CATALINA_TMPDIR%"
在echo Using CATALINA_BASE: "%CATALINA_BASE%"上面添加:
set JAVA_OPTS=%JAVA_OPTS% -Xms1024m -Xmx1024m -XX:PermSize=64M -XX:MaxPermSize=128m -XX:MaxNewSize=256m
三、使用jetty:run容器解决内存异常的问题
使用maven作为编译工具,内置jetty插件来开发项目效率会提高很多,使用jetty修改最大堆栈内存方式如下:
在jre中加入:
-server -Xms256m -Xmx512m -XX:PermSize=256m -XX:MaxPermSize=256m
参考:http://outofmemory.cn/c/java-outOfMemoryError