1. 引出问题
今天,在回顾开发曾遇到的问题,忽起来java.lang.OutOfMemoryError: PermGen space
,如下图所示:
2. 分析问题
PermGen space
的全称是Permanent Generation space
,是指内存的永久保存区域。
OutOfMemoryError: PermGen space
从表面上看就是内存益出,解决方法也一定是加大内存。
为什么会内存益出?
这一部分(PermGen space
)用于存放Class
和Meta
的信息。
Class
在被 Load
的时候被放入PermGen space
区域,它和存放Instance
的Heap
区域不同,GC(Garbage Collection)
不会在主程序运行期对PermGen space
进行清理。
所以如果你的APP
会LOAD
很多CLASS
的话,就很可能出现PermGen space
错误。
这种错误常见在web
服务器对JSP
进行pre compile
的时候。
3. 解决问题
3.1 手动设置tomcat的MaxPermSize大小
我们需要修改TOMCAT_HOME/bin/catalina.bat(windows系统)
或者catalina.sh(unix系统)
-
windows
系统:-
打开
TOMCAT_HOME/bin/catalina.bat
文件 -
在这句话
echo Using CATALINA_BASE: "%CATALINA_BASE%"
的上面添加如下行:
-
set JAVA_OPTS=%JAVA_OPTS% -server -XX:PermSize=256M -XX:MaxPermSize=512m
-
unix
系统-
vim
打开catalina.sh文件 -
在这句话
echo "Using CATALINA_BASE: $CATALINA_BASE"
上面或第一行添加此行:set JAVA_OPTS=%JAVA_OPTS% -server -XX:PermSize=256M -XX:MaxPermSize=512m
-
或者加入如下行:
-
JAVA_OPTS="-server -Xms800m -Xmx800m -XX:PermSize=64M -XX:MaxNewSize=256m -XX:MaxPermSize=128m -Djava.awt.headless=true "
3.2 基于MyEclipse的修改
如果是通过MyEclipse
启动服务器来启动Tomcat
的话,需要在MyEclipse
里面同样设置内存大小:
MyEclipse
中原配置的java虚拟机参数为:
-Xms512m
-Xmx1024m
-XX:PermSize=128M
-XX:MaxPermSize=256M
如下图所示:
默认配置java虚拟机参数为-Xms64m -Xmx256m
,如下图所示:
- 修改
eclipse.ini
在Myeclipse
安装目录下有一个myeclipse.ini
配置文件,设置如下:
-vmargs
-Xmx512m
-XX:MaxPermSize=256m
-XX:ReservedCodeCacheSize=64m
我的MyEclipse
的安装目录是G:\MyEclipse8.5\Genuitec\MyEclipse 8.5
,你可以根据自己的安装目录来。
- 设置
Default VM Arguments
在myEclipse
中,打开Windows -> Preferences -> Java -> Installed JREs -> 点击正在使用的JDK -> Edit -> Default VM Arguments
文本框中输入:-Xms64m -Xmx256m
-
如果是
web
工程还报内存溢出,可能就要设置tomcat
内存。-
tomcat
的安装根目录%tomcat%bin/catalina.bat
文件,SET JAVA_OPTS
一行 -
myeclipse
配置web
服务器配置Window -> Preferences -> Myeclipse -> Servers -> tomcat 5.x -> JDK的Optional Java VM arguments
配置为:
-
-Xms256m
-Xmx512m
-XX:MaxNewSize=256m
-XX:MaxPermSize=256m
- 如果是
debug
模式运行,需要调整debug
的虚拟机参数,因为debug
模式的默认内存分配时很少的。
选择Arguments
在VM arguments
里面填写内存值如下:
-Xms256m
-Xmx512m
-XX:MaxNewSize=256m
-XX:MaxPermSize=256m
3.3 基于idea的修改
如果你的编辑器是idea
,可以进行如下修改:
- 打开
Tomcat
配置Edit Configurations
- 点击
Server
,在VM options
输入框输入如下配置
-Xms512m
-Xmx2048m
-XX:PermSize=512m
-XX:MaxPermSize=2048m
点击ok
即可。
如果不点击ok
,则配置不生效。
4. jvm配置参数详解
一般的ini
文件设置主要包括以下几项:
-vmargs
-Xms40m
-Xmx256m
-XX:PermSize=64M
-XX:MaxPermSize=128M
参数解释为:
-
-vmargs
:说明后面是VM
的参数 -
-Xms40m
:虚拟机占用系统的最小内存 -
-Xmx256m
:虚拟机占用系统的最大内存 -
-XX:PermSize
:最小堆大小。一般报内存不足时,都是说这个太小,堆空间剩余小于5%
就会警告,建议把这个稍微设大一点,不过要视自己机器内存大小来设置 -
-XX:MaxPermSize
:最大堆大小。这个也适当大些,所以若出现问题,首先请调整-Xms40m
:将其设置的小一些,就ok了。
如果你的是1g内存,推荐设置为:
-vmargs
-Xms128M
-Xmx512M
-XX:PermSize=256M
-XX:MaxPermSize=512M
其中-XX:PermSize=64M
可以设置大一些,但不能超过MaxPermSize -Xmx512M
的5%
为25.6M。
理论上要求-Xmx
的数值与-XX:MaxPermSize
必须大于25.6M。