本文由 ImportNew - 刘志军 翻译自 mkyong。欢迎加入Java小组。转载请参见文章末尾的要求。
很多时候,在开发阶段Tomcat重复的重启过程中会遇到java.lang.OutOfMemoryError : PermGen space 错误。 1234 | 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选项设置。 12 | -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文件。这个文件就是用来设置环境变量的。 12345678910 | rem Get standard environment variables if not exist "%CATALINA_BASE%\bin\setenv.bat" goto checkSetenvHome call "%CATALINA_BASE%\bin\setenv.bat" goto setenvDone :checkSetenvHome if exist "%CATALINA_HOME%\bin\setenv.bat" call "%CATALINA_HOME%\bin\setenv.bat" :setenvDone |
在Windows中设置环境,你需要手工创建setenv.bat文件,然后把它放在${tomcat-folder}\bin 目录下面。 12 | set JAVA_OPTS=-Dfile.encoding=UTF- 8 -Xms128m -Xmx1024m -XX:PermSize=64m -XX:MaxPermSize=256m |
注意:这里的JAVA_OPTS={value}没有双引号。 重启tomcat,它会自动调用setenv.bat文件来设置这些环境变量。 1 | {$tomcat-folder}\bin\catalina.bat restart |
Linux Linux平台下原理是一样的, 只是文件变成了catalina.sh 和 setenv.sh. 找到catalina.sh文件, 如果你不知道放在什么目录, 那么全盘扫描一下: 123456 | 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下类似的代码: 1234567891011 | # 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}\bin\}目录下, 文件的内容是: 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大小仅仅是示例,你需要根据自己的项目需要来调整他们的值。 |