• [Java] 使用Java Visual VM寻找PermGen Space的解决办法


    在Eclipse使用tomcat运行3个项目时,老是报这个错误,以下为错误详情:

    2014-5-28 13:47:41 org.apache.catalina.core.StandardWrapperValve invoke 严重: Servlet.service() for servlet dispatcher-
    servlet threw exception
    java.lang.OutOfMemoryError: PermGen space
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClassCond(Unknown Source)
        at java.lang.ClassLoader.defineClass(Unknown Source)
        at java.security.SecureClassLoader.defineClass(Unknown Source)

    原先就知道可以设置相应参数即可:http://www.cnblogs.com/garinzhang/archive/2013/03/20/2970901.html

    尝试过之后发现依然不行,在网络上继续寻找解决办法。

    方法1:修改catalina.sh(Linux)/catalina.bat(Windows):

    Linux通过文本搜索找到echo "Using CATALINA_BASE:   $CATALINA_BASE",在上面加入:JAVA_OPTS=-server -XX:PermSize=64M -XX:MaxPermSize=128m

    Windows通过搜索找到echo Using CATALINA_BASE:   "%CATALINA_BASE%",在上面加入:set JAVA_OPTS=%JAVA_OPTS% -server -XX:PermSize=128m -XX:MaxPermSize=512m

    此方法试过之后,异常依然出现,在更改了PermSize之后,重新启动tomcat,依然失败

    方法2:还是修改catalina.sh/bat文件:

    rem catalina.bat
    set JAVA_OPTS=-Xms64m -Xmx256m -XX:PermSize=128m -XX:MaxNewSize=256M -XX:MaxPermSize=256m
    #catalina.sh
    JAVA_OPTS=
    -Xms64m
    -Xmx256m
    -XX:PermSize=128m
    -XX:MaxNewSize=256m
    -XX:MaxPerSize=256m

    重新启动tomcat,依然失败

    方法3:在Eclipse的eclipse.ini文件最后添加如下:

    -Xms256m
    -Xmx512m
    -XX:PermSize=512m
    -XX:MaxPermSize=512m

    重新启动Eclipse,依然失败

    以上三个方法都是网上大部分给出的方法,想来别人肯定是实验成功的,为什么就不行呢,查看多篇文章之后,有些地方提到jvisualvm.exe这个工具,可以用来查看内存大小,最后通过以下步骤找到解决办法:

    1. 使用JDK bin目录下面的工具:jvisualvm.exe(Java VisualVM),查看PermGen信息,才看出问题来,如下图红框为PermGen,旁边的tab为堆,就是所谓的Heap(如果Heap出现问题,则可以使用它来查看)

    image

    PermGen下面的三个值分别是(最小值、当前正在用的、最大值),我在Eclipse启动的时候,PermGen显示,最小值和最大值只有64M,所以很简单的溢出了,而我明明改过tomcat和eclipse的配置文件了呀,为什么还是这样呢?

    2. 直接从tomcat/bin目录下去启动(不使用Eclipse的插件),发现我VisualVM里的tomcat的PermGen的最小、大值发生了改变,与先前在tomcat里设置的值相符,并且能正常启动。

    这说明,前面方法1、2设置的值是对的,网上给出的方法是对的,由于我设置的PermGen值为256M,而我总共分配给JVM的才256M,所以又出现Heap溢出,这时候可以使用Visual VM清晰看出Heap溢出的情况。所以在设置的时候PermGen占的内存不能大于等于VM的占的总内存,设置为一半就差不多了

    3. 此时问题很明确,Eclipse的tomcat插件肯定不是使用的tomcat安装目录下的设置,或者在eclipse被覆盖了,所以找到Eclipse的Tomcat插件设置,设置如下:

    image

    此时再通过Eclipse启动tomcat,就再也没出现这个问题了

    后记:通过对Eclipse的内存使用Visual VM查看,发现方法3其实设置的是Eclipse的设置,不是tomcat的,所以以后设置不对的时候,使用Visual VM一看必知问题在哪。

    参考:

    http://www.cnblogs.com/xwdreamer/archive/2011/11/21/2296930.html

    http://woo-program.iteye.com/blog/1243613

    http://blog.sina.com.cn/s/blog_6840f82901013wk8.html

    http://www.iteye.com/problems/93036

    http://www.mkyong.com/tomcat/tomcat-javalangoutofmemoryerror-permgen-space/

    http://hi.baidu.com/chssheng2007/item/3f8cd7e7d41ed80c8c3ea8c2

    http://hi.baidu.com/ijczwiiukobnorq/item/9d6ca3c35ed80c7788ad9e66

  • 相关阅读:
    Spring Cloud(面试必备):服务雪崩、降级与熔断
    SpringCloud 分布式事务解决方案
    2020年3月25java现场面试(有点料)
    SpringCloud Feign工作原理
    MySQL数据库引擎详解
    MySQL Hardware--CentOS 6修改CPU性能模式
    MySQL Hardware--网络测试
    MySQL Execution Plan--EXPLAIN用法
    MySQL Event--Event and EventScheduler
    MySQL Error--Error Code
  • 原文地址:https://www.cnblogs.com/garinzhang/p/jvisualvm_resolve_permgen_space.html
Copyright © 2020-2023  润新知