• tomcat内存溢出之PermGen space


    线上一台web服务器不能正常访问了,检查了一下,tomcat进程还在,就是web不能正常访问,重启一下tomcat恢复正常,查询日志,发现提示内存溢出,如下图:

    java.lang.OutOfMemoryError: PermGen space

    java.lang.OutOfMemoryError: PermGen space

    查找资料了解到:PermGen space的全称是Permanent Generation space,是指内存的永久保存区域,这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGen space中,它和存放类实例(Instance)的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的应用中有很CLASS的话,就很可能出现PermGen space错误,这种错误常见在web服务器对JSP进行pre compile的时候。如果你的WEB APP下都用了大量的第三方jar, 其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了。但目前的hibernate和spring项目中也很容易出现这样的问题。可能是由于这些框架会动态class,而且jvm的gc是不会清理PemGen space的,超过了jvm默认的大小(4M),导致内存溢出。

    建议:将相同的第三方jar文件移置到tomcat/shared/lib目录下,这样可以达到减少jar 文档重复占用内存的目的。这一个一般是加大-XX:PermSize -XX:MaxPermSize 来解决问题。-XX:PermSize 永久保存区域初始大小-XX:PermSize 永久保存区域初始最大值。这一般结合第一条使用,比如 set JAVA_OPTS= -Xms1024m -Xmx1024m -XX:PermSize=128M -XX:PermSize=256M

    有一点需要注意:java -Xmx***M version 命令来测试的最大堆内存是 -Xmx与 -XX:PermSize的如系统支持最大的jvm堆大小事1.5G,那 -Xmx1024m -XX:PermSize=768M 是无法运行的。java -XmxXXXXm(g) -version其中XXXX为最大内存数,m(g)是内存的计量单位,在以上命令中将XXXX写为具体数字,根据情况采用m或g为单位,如果命令能正确显示出jdk的版本信息,则说明当前jdk支持XXXX的最大内存,如果不能正确显示出版本信息则表示超出了jdk支持的最大值。

    -----------------解决方案1:-------------------------
    Linux服务器:
    在catalina.sh的第一行增加:
    JAVA_OPTS=
    -Xms64m
    -Xmx256m
    -XX:PermSize=128M
    -XX:MaxNewSize=256m
    -XX:MaxPermSize=256m
    或者
    在“echo "Using CATALINA_BASE:   $CATALINA_BASE"”上面加入以下行:
    JAVA_OPTS="-server -XX:PermSize=64M -XX:MaxPermSize=128m
    Windows服务器:
    在catalina.bat的第一行增加:
    set JAVA_OPTS=-Xms64m -Xmx256m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=256m 
    -----------------解决方案2:------------------------
    修改TOMCAT_HOME/bin/catalina.bat(Linux下为catalina.sh),在Java代码
    “echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行:   
    set JAVA_OPTS=%JAVA_OPTS% -server -XX:PermSize=128M -XX:MaxPermSize=512m  

    “echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行:
    set JAVA_OPTS=%JAVA_OPTS% -server -XX:PermSize=128M -XX:MaxPermSize=512m

    catalina.sh下为:
    Java代码
    JAVA_OPTS="$JAVA_OPTS -server -XX:PermSize=128M -XX:MaxPermSize=512m" 

    JAVA_OPTS="$JAVA_OPTS -server -XX:PermSize=128M -XX:MaxPermSize=512m"

    线上服务器由于已经配置了堆转储:

    JAVA_OPTS="$JAVA_OPTS -server -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/usr/local/tomcat/heapdump"

    不能直接配置调优参数,我就把调优参数放在catalina.sh的第二行,如下所示:

    JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms2048m -Xmx2048m -XX:NewSize=256m -XX:MaxNewSize=256m -XX:PermSize=512m -XX:MaxPermSize=1024m -XX:+DisableExplicitGC"

    我的线上服务器物理内存是8G,我这个调优的配置参数还在测试中,完成后重启tomcat,注意观察log日志。

    参考博客:http://blog.sina.com.cn/s/blog_5736f0910100sm6l.html

  • 相关阅读:
    CSS3 Transitions 你可能不知道的知识点
    css规范
    移动应用表单设计秘籍
    SVN和Git的一些用法总结
    让Terminal显示git分支
    JavaScript正则表达式下——相关方法
    requests模块
    flask模块
    os模块
    简单的socket编程
  • 原文地址:https://www.cnblogs.com/zydzyd/p/5629286.html
Copyright © 2020-2023  润新知