您现在的位置是:首页 >  云笔记 >  开发随笔 >  文章详情

Tomcat 7出现java.lang.OutOfMemoryError: PermGen space解决方法

特不靠谱   2020-09-16 21:58:06   401人已围观

第一、原因分析:

          PermGen space的全称是Permanent Generation space,是指内存的永久保存区域。OutOfMemoryError: PermGen space从表面上看就是内存益出,解决方法也一定是加大内存。说说为什么会内存益出:这一部分用于存放Class和Meta的信息,Class在被 Load的时候被放入PermGen space区域,它和和存放Instance的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的应用会加载LOAD很多CLASS的话,就很可能出现PermGen space错误。这种错误常见在web服务器对程序进行预编译的时候。

第二、解决方法:

       手动设置MaxPermSize大小:

       修改TOMCAT_HOME/bin/catalina.bat(windows系统)或者catalina.sh(linux系统),文件非注释第一行,位置cygwin=false前,手动添加一行(注意引号要带上),我以linux设置截图为例:

  1.windows系统  在 TOMCAT_HOME/bin/catalina.bat 文件 echo Using CATALINA_BASE:   "%CATALINA_BASE%"上面加入以下行:set JAVA_OPTS=%JAVA_OPTS% -server -XX:PermSize=256M -XX:MaxPermSize=512m

  2.linux系统 在 catalina.sh 文件 文件非注释第一行,位置cygwin=false前,手动添加一行:

   JAVA_OPTS="-server -Xms800m -Xmx800m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=256m -Djava.awt.headless=true "

文件位置:

文件位置.png

修改代码:

3.png

如果改完后不正常执行./shutdown.sh 会报错:

[root@root bin]# ./shutdown.sh 
Using CATALINA_BASE:   /usr/www.onekbit.com/tomcat
Using CATALINA_HOME:   /usr/www.onekbit.com/tomcat
Using CATALINA_TMPDIR: /usr/www.onekbit.com/tomcat/temp
Using JRE_HOME:        /usr/www.onekbit.com/jdk/jre
Using CLASSPATH:       /usr/www.onekbit.com/tomcat/bin/bootstrap.jar:/usr/www.onekbit.com/tomcat/bin/tomcat-juli.jar
Usage: catalina.sh ( commands ... )
commands:
  debug             Start Catalina in a debugger
  debug -security   Debug Catalina with a security manager
  jpda start        Start Catalina under JPDA debugger
  run               Start Catalina in the current window
  run -security     Start in the current window with security manager
  start             Start Catalina in a separate window
  start -security   Start in a separate window with security manager
  stop              Stop Catalina, waiting up to 5 seconds for the process to end
  stop n            Stop Catalina, waiting up to n seconds for the process to end
  stop -force       Stop Catalina, wait up to 5 seconds and then use kill -KILL if still running
  stop n -force     Stop Catalina, wait up to n seconds and then use kill -KILL if still running
  configtest        Run a basic syntax check on server.xml - check exit code for result
  version           What version of tomcat are you running?
Note: Waiting for the process to end and use of the -force option require that $CATALINA_PID is defined

第三、JVM启动模式简介

          Tomcat本身不能直接在计算机上运行,需要依赖于硬件基础之上的操作系统和一个java虚拟机,而虚拟机JVM主要有 Server模式与client模式两种启动,最主要的差别在于:-Server模式启动时,速度较慢,但是一旦运行起来后,性能将会有很大的提升。JVM工作在Server模式下可以大大提高性能,Server模式下应用的启动速度会比client模式慢大概10%,但运行速度比Client VM要快至少有10倍。server:启动慢,编译更完全,编译器是自适应编译器,效率高,针对服务端应用优化,在服务器环境中最大化程序执行速度而设计。client:快速启动,内存占用少,编译快,针对桌面应用程序优化,为在客户端环境中减少启动时间而优化;

         当不指定运行模式参数时,虚拟机启动检测主机是否为服务器,如果是,则以Server模式启动,否则以client模式启动,J2SE5.0检测的根据是至少2个CPU和最低2GB内存,由于服务器的CPU、内存和硬盘都比客户端机器强大,所以程序部署后,都应该以server模式启动,获取较好的性能;JVM在client模式默认-Xms是1M,-Xmx是64M;JVM在Server模式默认-Xms是128M,-Xmx是1024M;
        我们可以通过运行:java -version来查看jvm默认工作在什么模式。如下图:

查看jvm启动模式.png

      这里就是以server模式启动的。

第四、设置建议:

 -server : 以server模式启动

 -vmargs:说明后面是VM的参数

-Xms:JVM堆内存的初始大小,默认是物理内存的1/64

-Xmx:JVM堆内存的最大内存,默认是物理内存的1/4,一般建议堆的最大内存设置为可用内存的最大值的80%;

-Xmn:新生代内存大小,官方建议是整个堆的3/8;

-XX:PermSize:设置持久代(Perm gen)初始大小。默认是物理内存的1/64;一般报内存不足时,都是说这个太小,堆空间剩余小于5%就会警告,建议把这个稍微设大一点,不过要视自己机器内存大小来设置

-XX:MaxPermSize:设置持久代(Perm gen)最大值大小,默认是物理内存的1/4。这个也适当大些

-XX:newSize:表示新生代初始内存的大小,应该小于-Xms的值;

-XX:MaxnewSize:表示新生代可被分配的内存的最大上限;当然这个值应该小于-Xmx的值;


其中一个很重的要的知识点就是:

(1)、 整个堆大小=年轻代大小 + 年老代大小 + 持久代大小.

(2)、通常会将-Xms 与-Xmx两个参数的配置相同的值,其目的是为了能够在java垃圾回收机制清理完堆区后不需要重新分隔计算堆区的大小而浪费资源。

我这里使用的是tomcat7.0.59版本。

参考文档:

1、http://www.360doc.com/content/14/0814/15/16493677_401816839.shtml

2、https://blog.csdn.net/kidoo1012/article/details/54599046?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~all~sobaiduend~default-4-54599046.nonecase&utm_term=jvm%E8%AE%BE%E7%BD%AE%E5%B9%B4%E8%BD%BB%E4%BB%A3%E5%A4%A7%E5%B0%8F

分享到:

编辑发布时间:2020-09-16 21:58:06