关于PermGenSpace内存溢出解决方案

来源:互联网 发布:在linux用yum安装jdk 编辑:程序博客网 时间:2024/05/29 07:59

关于PermGenSpace内存溢出解决方案

内存溢出分为Heap Space和PermGen Space两种异常。正巧的是我这次就碰到了PermGenspace异常,为了解决这个异常花了我 半天的时间,所以今天写这个方案就是做一种笔记。

 

刚开始碰到这个内存溢出的问题的时候,我一直没有去管他,因为开发时间紧我不得不放弃这些系统抛出的异常。

 

废话不多说了,先来看看这次内存溢出到底是怎么一回事。

启动tomcat没有问题,并且还能够访问,但是当你访问的页面越来越多的时候,会突然间蹦出一个PermGen space内存溢出的异常。其实这个问题看起来是很简单的,只要修改一下永久域的大小就可以了。于是我的同事就发给我一段修改永久域大小的代码:

JAVA_OPTS="-server-Xms800m -Xmx800m -XX:PermSize=128M -XX:MaxNewSize=256m-XX:MaxPermSize=128m"(Xms堆内存初始值,Xmx堆内存最大值,为什么Xms和Xmx要设置一样大呢,因为如果你设置Xms初始值和Xms不一样,那么每次内存增大的时候都需要重新分配内存给堆,这样的每次增大都会相应的浪费时间。所以干脆设置Xms和Xmx一样。Xx:permsize是永久域的初始值,xx:maxpersize是最大分配的永久域空间,xx:maxnewsize是新域最大值)

把这段代码放到tomcat\bin目录下的catalina.bat文件(Linux修改catalina.sh)的第一行就可以了。弄好之后以为ok了。结果,结果。。。。

还是报PermGen Space内存溢出,我在想是不是空间还不够大,于是把XX:PermSize设置512M,XX:MaxPermSize设置1024M。

满怀信心的一式结果崩溃了,还是报内存溢出,我还在想是不是内存空间分配的不够大啊,于是我又加大内存,结果一次次的失败。

于是我就在想到底是哪里需要分配这么大的内存,于是我换了一条思路,我来找哪里消耗的内存最大,于是找到一种工具就是jvm自带的,打开cmd然后输入jconsole,会弹出一个对话框,如图:



我选择远程进程,如何来设置这个远程进程连接呢:

打开Catalina.bat文件,然后找到rem -----Execute The Requested Command

在这个下面加入以下代码:

set JAVA_OPTS= %JAVA_OPTS%-Djava.rmi.server.hostname=xx.xxx.xx.xx(ip)

set JAVA_OPTS= %JAVA_OPTS%-Dcom.sun.management.jmxremote.port=xxxx(端口)

set JAVA_OPTS= %JAVA_OPTS%-Dcom.sun.management.jmxremote.ssl=false

set JAVA_OPTS= %JAVA_OPTS%-Dcom.sun.management.jmxremote.authenticate=false(如果为true就需要账号密码,这里为false简单点)

 

现在把ip和端口输入jconsole里面进行远程连接:

 

选择“内存”---“Ps Perm Gen”发现分配的内存还是只有80多M,我不是已经分配了2个G的内存给permGen space吗,为什么这里还是80多m呢。

 

猛然间想到是不是分配内存的代码错了

于是乎开始寻找新的内存分配代码这一次就有了下面这一段代码:

set JAVA_OPTS=-Xms800m -Xmx800m -XX:PermSize=128M-XX:MaxNewSize=256m -XX:MaxPermSize=256m

给永久域初始值分配128M,然后再用jconsole来查看,发现permGenspace不报内存溢出了。哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈啊哈哈哈哈哈哈啊


原创粉丝点击