通过java.lang.OutOfMemoryError: PermGen space回顾永生代并处理
问题环境:在windows服务器下,重新建立了一个tomcat来跑一些东西,原先的tomcat是处在apche+modjk+tomcat负载均衡的情况下。这里为了图省事,直接复制过来一个分支的tomcat并修改端口号以及配置文件。第一次使用statup.bat的执行的时候,就出现了上面java.lang.OutOfMemoryError: PermGen space的问题。看到这个很容易想到虚拟内存的问题。
Windows系统下,修改tomcat\bin\catalina.bat,在“echo Using CATALINA_BASE: "%CATALINA_BASE%"”上面加入以下行:
set JAVA_OPTS=%JAVA_OPTS% -server -XX:PermSize=128M -XX:MaxPermSize=512m
Linux系统下,修改tomcat\bin\catalina.sh,在“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行:
JAVA_OPTS="$JAVA_OPTS -server -XX:PermSize=128M -XX:MaxPermSize=512m"
这边是win所以复制上面参数过去没有什么问题,错误消失了。就在注册系统服务后,发现启动假死,又出现了上述错误。
对于PermGen space这个东西似乎是不大熟悉,只知道加了堆内存设置就会消失了。这里简单回顾了一下:
PermGen space被叫做永生代,当超出了分配的最大堆内存(JvmMx)时候,Jvm会像系统要内存于是它就产生了。有时候也叫非堆内存,默认物理内存的1/4。
JDK8已经取消,改为元空间,元空间不需要指定大小,自动扩展。呃...
解决办法:
肯定是:1、修改JDK版本
2、修改虚拟内存
3、修改永生代PermGen
但是我并不晓得怎么搞。无论win还是linux我都是修改catalin文件(.bat.sh)。
我改了catalin.bat,使用starup.bat执行是可以的,但以系统服务运行的时候似乎并没有生效。
我想了很久,到处寻找终于找出问题。两种方式的运作流程是不一样的。

bat脚本启动:startup.bat→catalin.bat→tomcat.exe
以系统服务启动:service.bat→tomcat.exe
所以之前在catalin.bat配置不是似乎没有生效,而是根本没走它。运作机制的不同,但是配置的永生代不起作用。
修改service.bat
打开service.bat文件,找到如下两个参数--JvmMs(最小内存)、--JvmMx(最大内存) 修改为自己需要的大小,我们可以看到,图中,这两个参数的默认值,我们只需要修改默认值,保存,然后重新安装服务。
我尝试了但没有成功,当然也有可能是我设置还不够大。

if "%SERVICCE_STARTUP_MODE%" == "" set SERVICCE_STARTUP_MODE=manual
if "%JvmMs%" == "" set JvmMs=128
if "%JvmMx%" == "" set JvmMx=512
使用tomcatGUI工具配置
注册系统服务后,命令行执行如下命令出来个框
tomcat7.exe //RS//Tomcat75
Java栏,在Java Options里面输入需要设置的参数,如设置permsize的内存
-XX:PermSize=128M
-XX:MaxPermSize=512m
-XX:ReservedCodeCacheSize=48m
-Duser.timezone=GMT+08
上面这个我是打算尝试来着,但是我发现那个好像配置有别的东西(也有可能我的tomcat是复制的连带了一些emmm)然后我放弃了
修改注册表
最后一种方法,也是使用的那种。
在注册表中进行修改,HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Procrun 2.0\TestService\Parameters\Java
在Options中添加参数,
-Xms1500M
-Xmx1500M
-Xss512k
-XX:NewRatio=3
-XX:PermSize=300M
-XX:MaxPermSize=1000M
一路踩坑成功。

浙公网安备 33010602011771号