Tomcat – Java.Lang.OutOfMemoryError: PermGen Space

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

很多时候,在开发阶段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}\bin\catalina.bat
//...
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 目录下面。

1
2
//${tomcat-folder}\bin\setenv.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}\bin\catalina.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}\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大小仅仅是示例,你需要根据自己的项目需要来调整他们的值。

目录
相关文章
|
3月前
|
Java Linux
8 种 Java- 内存溢出六 -Out of swap space?
8 种 Java- 内存溢出六 -Out of swap space?
|
4月前
|
Java 关系型数据库 MySQL
Windows用Tomcat发布Java项目
对于云服务器,程序员一般不会陌生,如果项目需要发布到现网,那么服务器是必不可缺的一项硬性条件,那么如何在云服务器上部署一个项目,需要做哪些配置准备,下面就由本文档为大家讲解,本篇以Tomcat服务器发布J2EE项目为例。
53 0
Windows用Tomcat发布Java项目
|
3月前
|
JavaScript Java 应用服务中间件
centos部署vue项目(java,tomcat环境的搭建)
centos部署vue项目(java,tomcat环境的搭建)
53 0
|
3天前
|
IDE Java 应用服务中间件
JDK1.6.0+Tomcat6.0的安装配置(配置JAVA环境)
JDK1.6.0+Tomcat6.0的安装配置(配置JAVA环境)
14 1
|
27天前
|
Web App开发 Java 应用服务中间件
【Java Web】在 IDEA 中部署 Tomcat
【Java Web】在 IDEA 中部署 Tomcat
|
2月前
|
Java 应用服务中间件
解决tomcat启动报错:无法在web.xml或使用此应用程序部署的jar文件中解析绝对的url [http:java.sun.com/jsp/jstl/core]
解决tomcat启动报错:无法在web.xml或使用此应用程序部署的jar文件中解析绝对的url [http:java.sun.com/jsp/jstl/core]
272 1
|
3月前
|
存储 Java 关系型数据库
8 种 Java- 内存溢出之三 -Permgen space
8 种 Java- 内存溢出之三 -Permgen space
|
4月前
|
监控 应用服务中间件
idea debug模式启动Tomcat报错:Error running ‘tomcat8‘: java.net.SocketException “socket closed“
idea debug模式启动Tomcat报错:Error running ‘tomcat8‘: java.net.SocketException “socket closed“
|
9月前
|
SQL 关系型数据库 MySQL
CentOS部署JAVA程序、安装Tomcat以及安装导入mysql文件的方法
CentOS部署JAVA程序、安装Tomcat以及安装导入mysql文件的方法
|
5月前
|
jenkins Java 应用服务中间件
Jenkins【部署 01】两种方式+两种环境部署最新版本 Jenkins v2.303.2 WAR包(直接使用 java -jar+使用Tomcat的Web端部署)
Jenkins【部署 01】两种方式+两种环境部署最新版本 Jenkins v2.303.2 WAR包(直接使用 java -jar+使用Tomcat的Web端部署)
82 0