如何清除tomcat中的PermGen空间错误

问题描述 投票:53回答:11

我在Windows环境中工作,每次与tomcat一起工作时都会出现此错误,

Apr 30, 2012 5:30:37 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet default threw exception
java.lang.OutOfMemoryError: PermGen space
2012-04-30 17:30:37.719 INFO net.spy.memcached.MemcachedConnection:  Connection state changed for sun.nio.ch.SelectionKeyImpl@4ae53a99
2012-04-30 17:30:37.719 INFO net.spy.memcached.MemcachedConnection:  Reconnecting due to failure to connect to {QA sa=localhost/127.0.0.1:11211, #Rops=0, #Wops=0, #iq=0, topRop=null, topWop=null, toWrite=0, interested=0}
java.net.ConnectException: Connection refused: no further information
Apr 30, 2012 5:30:37 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet default threw exception
java.lang.OutOfMemoryError: PermGen space
Exception in thread "Memcached IO over {MemcachedConnection to localhost/127.0.0.1:11211}" java.lang.OutOfMemoryError: PermGen space
Apr 30, 2012 5:30:38 PM org.apache.coyote.http11.Http11Processor process
SEVERE: Error processing request
java.lang.OutOfMemoryError: PermGen space
Apr 30, 2012 5:30:38 PM org.apache.coyote.http11.Http11Processor process
SEVERE: Error processing request
java.lang.OutOfMemoryError: PermGen space
Apr 30, 2012 5:30:38 PM org.apache.coyote.http11.Http11Processor process
SEVERE: Error processing request
java.lang.OutOfMemoryError: PermGen space
Apr 30, 2012 5:30:41 PM org.apache.catalina.connector.CoyoteAdapter service
SEVERE: An exception or error occurred in the container during the request processing
java.lang.OutOfMemoryError: PermGen space
Apr 30, 2012 5:30:43 PM org.apache.catalina.core.StandardHostValve custom
SEVERE: Exception Processing ErrorPage[exceptionType=java.lang.Throwable, location=/error.action]
java.lang.OutOfMemoryError: PermGen space
Apr 30, 2012 5:30:42 PM org.apache.catalina.core.StandardHostValve custom
SEVERE: Exception Processing ErrorPage[exceptionType=java.lang.Throwable, location=/error.action]
java.lang.OutOfMemoryError: PermGen space
Exception in thread "ContainerBackgroundProcessor[StandardEngine[Catalina]]" java.lang.OutOfMemoryError: PermGen space

我曾尝试在系统变量中添加JAVA_OPTS with the value as -Xms1024m -Xmx1024m,但仍一次又一次得到相同的错误((java.lang.OutOfMemoryError:PermGen space)])。

任何帮助将不胜感激。我也阅读了有关Stack Overflow的其他文章,但没有解决。

java tomcat permgen
11个回答
107
投票

PermGen空间是Tomcat用来存储类定义(仅定义,没有实例化)和已被嵌入的字符串池的空间。根据经验,PermGen空间问题往往在开发环境中经常发生,这是因为Tomcat每次部署WAR或执行jspc时(当您编辑jsp文件时)都必须加载新类。就个人而言,在进行开发测试时,我倾向于部署和重新部署大量战争,所以我知道我早晚会耗尽(主要是因为Java的GC周期仍然很糟糕,因此如果您快速且频繁地重新部署战争,足够,空间填满的速度超出了他们的管理能力。]

从理论上讲,这在生产环境中应该不是问题,因为(希望)您不会在10分钟内更改代码库。如果仍然发生,那意味着您的代码库(和相应的库依赖项)对于默认的内存分配来说太大了,您只需要弄乱堆栈和堆的分配。我认为标准是这样的:

-XX:MaxPermSize=SIZE

但是我发现最好的永久解决方法是允许卸载类,这样您的PermGen永远不会用完:

-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled

过去类似的东西对我来说很神奇。一件事,在使用这些性能时,需要进行重大的性能折衷,因为对于每个请求或类似的东西,permgen扫描将额外产生2个请求。您需要权衡取舍与使用。


0
投票

我在Intellij Ideav11上尝试过同样的方法。


-5
投票

杀死tomcat进程(强行杀死Linux的-9),然后再次启动它可以解决问题。我的猜测是,tomcat实例无法使用shutdown.bat正确杀死。因此,我们需要强行终止该进程,然后重新开始。


17
投票

您必须为tomcat JVM的PermGenSpace分配更多空间。

这可以通过JVM参数完成:-XX:MaxPermSize = 128m

默认情况下,PermGen空间为64M(并且包含所有编译的类,因此,如果您的类路径中有很多jar(类),则确实可以填充此空间)。

附带说明,您可以使用JVisualVM监视PermGen空间的大小,甚至可以使用YourKit Java Profiler检查其内容


10
投票

为了补充迈克尔的回答,并根据this answer,解决此问题的安全方法是使用以下参数:

-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled -XX:+UseConcMarkSweepGC

5
投票

如果tomcat作为Windows服务运行,则CATALINA_OPTS或JAVA_OPTS似乎都无效。

您需要在GUI的Java选项中进行设置。

下面的链接很好地解释了

http://www.12robots.com/index.cfm/2010/10/8/Giving-more-memory-to-the-Tomcat-Service-in-Windows


2
投票

[这对我有用,如果startup.bat中不存在值为set JAVA_OPTS的行,则需要在-Xms128m -Xmx1024m -XX:PermSize=64m -XX:MaxPermSize=256中添加以下行。完整行:

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

2
投票

在Tomcat 7.0 Windows服务安装程序版本中。/ bin中没有catalina.bat。因此,您需要在/ bin中打开Tomcat7w.exe并添加打击JVM参数

-XX:PermSize=256m -XX:MaxPermSize=512m

在Java选项卡的Java选项中,如下所示。您还添加其他选项。

enter image description here

另外,如果您使用IntellijIDEA,则需要在服务器配置中添加JVM参数,就像这样。

enter image description here


2
投票

@ AndreSmiley的行代码对我有用。

仅需要修改。

-XX:MaxPermSize = 256 m

“ m”表示MB。

实际上我的应用程序很大,因此建议我将其设置为1024m以提高性能。


1
投票

我正在CentOS 6.6上运行tomcat7。我尝试创建一个新的/usr/share/tomcat/bin/setenv.sh文件并设置JAVA_OPTSCATALINA_OPTS。但是tomcat在重新启动时不会选择这些值。当我将以下行放入/etc/tomcat/tomcat.conf时:

CATALINA_OPTS="-Xms128m -Xmx1024m -XX:MaxPermSize=1024m"

tomcat确实获得了新的环境变量。我通过运行]验证了这一点

ps aux | grep tomcat

并在输出中看到新设置。这花了很长时间才诊断出来,而且我没有看到其他人建议这样做,所以我想我应该把它扔给互联网社区。


1
投票

如果您在tomcat中使用eclipse,请执行以下步骤

© www.soinside.com 2019 - 2024. All rights reserved.