OutOfMemoryError:PermGen space

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/leo187/article/details/83866774
  • java.lang.OutOfMemoryError: PermGen spaces是指永久区内存溢出的错误,这个错误在java项目中十分常见。刚才部署时候又遇到了这个错误,这是第多少次遇到这个问题我自己都不记得了,可解决起来仍费了一番力气。主要因为网上的解决方案良莠不齐,而且没有一个合理的方法验证修改的内容是不是生效了。即使解决了也不明白究竟是修改哪里的配置生效了。所以现在我就整理一个解决的永久区溢出的合理方案,本文采取的是修改配置参数的方式解决。
  • 欲善其事必先利其器,在解决问题我们要先了解一个可视化工具visualvm。visualvm是jdk1.5后的版本中官方赠送的调试程序,虽然在官方文档中介绍这个工具仍处于测试阶段,但实际上这个工具已经十分成熟了,而且性能十分强悍,简单易用,建议大家深度挖掘一下。本文推荐通过visualvm工具去查看实时的JVM状况,从而判断做的修改是否有效,使用其他工具排查也是同样的道理。
  • windows环境中直接到jdk安装目录bin文件夹下双击jvisualvm.exe打开,或者在cmd下输入jvisualvm回车。也可以通过远程配置监控linux环境下的tomcat。我调试的是本地tomcat。
    在这里插入图片描述
  • 图中箭头指向的就是本次测试的tomcat,双击tomcat即可看到这个应用的详细信息以及内存占用情况。点击’工具’---->‘插件’----'可以插件’中下载Visual GC,Visual GC工具可以通过可视化窗口查看实际内存使用情况。如果可下载工具中没有Visual GC。可以参考[jvisualvm工具没有可用插件问题]
  • 现在我们模拟一个以及发生了‘java.lang.OutOfMemoryError: PermGen spaces’情况的tomcat。我设置了的参数内容为-XX:PermSize=50m -XX:MaxPermSize=50m,启动tomcat果然出现了内存溢出报错。
    在这里插入图片描述
  • 打开Visual GC窗口,通过观察左侧的柱状图可以看到perm已经满了。Old和Eden区的内存使用情况属于合理的情况。右下方的内存详细介绍中展示的perm区参数确实是-XX:PermSize=50m -XX:MaxPermSize=50m。
    在这里插入图片描述
  • 问题复现完成,我们就要动手解决了。翻了网上诸多版本的解决方案后得出了以下几种修改方式

(1)解压缩版tomcat修改tomcat\bin\Catalina.bat文件中的内存参数(解压缩和安装版本区别为bin下面有没start文件,有为解压缩版本)。具体修改为: 找到setlocal这一行,然后在这一行的上面一行,插入一行,内容如下

set "JAVA_OPTS=-server -Xms1024m -Xmx2048m  
		-XX:PermSize=256m
		-XX:MaxPermSize=512m"

在这里插入图片描述

(2)安装版本tomcat修改tomcat\bin\Tomact7w.exe中的Java options参数,修改方式为:在Java options中加入

-XX:PermSize=256m
-XX:MaxPermSize=512m

在这里插入图片描述

(3)myeclipse中修改jdk下的Optional Java VM arguments内存参数,修改方式为:打开Myeclipse–>Servers–>Tomcat–>Tomcat–>jdk修改Optional Java VM arguments参数: -XX:PermSize=256m -XX:MaxPermSize=512m

在这里插入图片描述

(4)myeclipse中修改Run Configurations中的Arguments内存参数,tomcat右键打开Run Configurations配置中心。在Arguments的页签下编辑VM arguments,加入 -XX:PermSize=128m -XX:MaxPermSize=256m

在这里插入图片描述

  • 通过对多种情况的测试后得出Myeclipse中启动Tomcat时,myeclipse中的jdk配置的优先级大于tomcat配置的优先级。通过对参数调优后我们再次启动项目,可以看到优化后的实时内存使用情况。在概述栏可以看到优化后的参数为256、512
    在这里插入图片描述
    Visual GC的实时情况
    在这里插入图片描述
  • 内存使用情况已经正常了,后台也没有内存溢出。
  • 本文中使用的参数都为256、512,大家可以按照自己的实际情况进行调配。不建议调的太大,满足项目运行需要即可。

猜你喜欢

转载自blog.csdn.net/leo187/article/details/83866774