zoukankan      html  css  js  c++  java
  • Tomcat – Java.Lang.OutOfMemoryError: PermGen Space

    很多时候,在开发阶段Tomcat重复的重启过程中会遇到java.lang.OutOfMemoryError : PermGen space 错误。

    1
    2
    3
    4
    java.lang.OutOfMemoryError: PermGen space
            at java.lang.ClassLoader.defineClass1(Native Method)
            at java.lang.ClassLoader.defineClass(ClassLoader.java:620)
            at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)

    怎么解决这种问题呢?

    默认情况下,在程序运行中Tomcat只分配了非常小的PermGen内存, 因此需要增加PermGen内存,你可以通过下面的Java VM选项设置。

    1
    2
    -XX:PermSize<size> - Set initial PermGen Size.
    -XX:MaxPermSize<size> - Set the maximum PermGen Size.

    换成Tomcat,该怎么设置呢? 接下来告诉你如果在Windows和Linux环境下,通过Tomcat来设置这些VM选项。

    Windows

    Tomcat是由脚本catalina.bat来管理的。深入到脚本里面,你会发现catalina.bat会去查找并且运行setenv.bat文件。这个文件就是用来设置环境变量的。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    //{$tomcat-folder}incatalina.bat
    //...
    rem Get standard environment variables
    if not exist "%CATALINA_BASE%insetenv.bat" goto checkSetenvHome
    call "%CATALINA_BASE%insetenv.bat"
    goto setenvDone
    :checkSetenvHome
    if exist "%CATALINA_HOME%insetenv.bat" call "%CATALINA_HOME%insetenv.bat"
    :setenvDone
    //...

    在Windows中设置环境,你需要手工创建setenv.bat文件,然后把它放在${tomcat-folder}in 目录下面。

    1
    2
    //${tomcat-folder}insetenv.bat
    set JAVA_OPTS=-Dfile.encoding=UTF-8 -Xms128m -Xmx1024m -XX:PermSize=64m -XX:MaxPermSize=256m

    注意:这里的JAVA_OPTS={value}没有双引号。

    重启tomcat,它会自动调用setenv.bat文件来设置这些环境变量。

    1
    {$tomcat-folder}incatalina.bat restart

    Linux

    Linux平台下原理是一样的, 只是文件变成了catalina.sh 和 setenv.sh.

    找到catalina.sh文件, 如果你不知道放在什么目录, 那么全盘扫描一下:

    1
    2
    3
    4
    5
    6
    catalina.sh
    $ sudo find / -name "catalina.sh"
    Password:
    find: /dev/fd/3: Not a directory
    find: /dev/fd/4: Not a directory
    /Users/mkyong/Downloads/apache-tomcat-6.0.35/bin/catalina.sh

    你会看到和Windows下类似的代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    //...
    # Ensure that any user defined CLASSPATH variables are not used on startup,
    # but allow them to be specified in setenv.sh, in rare case when it is needed.
    CLASSPATH=
     
    if [ -r "$CATALINA_BASE/bin/setenv.sh" ]; then
      . "$CATALINA_BASE/bin/setenv.sh"
    elif [ -r "$CATALINA_HOME/bin/setenv.sh" ]; then
      . "$CATALINA_HOME/bin/setenv.sh"
    fi
    //...

    创建setenv.sh,把它放在${tomcat-folder}in}目录下, 文件的内容是:

    1
    export JAVA_OPTS="-Dfile.encoding=UTF-8 -Xms128m -Xmx1024m -XX:PermSize=64m -XX:MaxPermSize=256m"

    注意:这里和Windows有细微区别,这里的value是有双引号的export JAVA_OPTS=”{value}”。

    重启Tomcat。

    注意:我这里设置的Perm Gen大小仅仅是示例,你需要根据自己的项目需要来调整他们的值。

  • 相关阅读:
    蛙蛙请教:把一段c算法代码转换成c#代码。
    和病毒折腾了两天
    WawaKM预览版发布,欢迎大家测试反馈哦
    (转)深度分析如何在Hadoop中控制Map的数量
    [转载]JAVA操作符
    (转)Hive Index
    Hadoop++:Hadoop的局部性能改良
    深入了解Hive Index具体实现
    Linux echo命令
    (转)带索引的mapReduce
  • 原文地址:https://www.cnblogs.com/yxnchinahlj/p/4298914.html
Copyright © 2011-2022 走看看