Tomcat中的PermGen空间错误

时间:2012-05-01 00:43:51

标签: java tomcat permgen

我在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)。任何帮助将不胜感激。我也读过stackoverflow中的其他帖子,但它没有成功。

11 个答案:

答案 0 :(得分:107)

PermGen空间是Tomcat用于存储类定义(仅限定义,无实例化)和已实例化的字符串池的空间。根据经验,PermGen空间问题往往在开发环境中经常发生,因为Tomcat必须在每次部署WAR或执行jspc(编辑jsp文件时)时加载新类。就个人而言,当我进行开发测试时,我倾向于大量部署和重新部署战争,所以我知道我迟早会跑出去(主要是因为Java的GC周期仍然有点废话,所以如果你快速和频繁地重新部署你的战争足够的,空间填充的速度超出了他们的管理范围。)

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

-XX:MaxPermSize=SIZE

但是我发现最好的方法就是允许卸载类,这样你的PermGen永远不会耗尽:

-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled

这样的东西在过去对我有用。有一点,在使用这些产品时会有显着的性能折衷,因为permgen扫描会对你提出的每个请求或类似的东西提出额外的2个请求。你需要平衡你的使用与权衡。

答案 1 :(得分:17)

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

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

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

在旁注中,您可以使用JVisualVM监控PermGen空间的大小,甚至可以使用YourKit Java Profiler检查其内容

答案 2 :(得分:10)

为了补充Michael的答案,根据this answer,处理问题的一种安全方法是使用以下参数:

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

答案 3 :(得分: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

答案 4 :(得分: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

答案 5 :(得分:2)

@AndreSmiley的代码为我工作。

只需要修改。

-XX:MaxPermSize参数= 256的

“m”表示MB。

实际上我的应用程序有点大,所以我被建议将它的性能提高到1024米。

答案 6 :(得分:2)

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

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

在Java Tab中的Java选项上,像这样。您还可以添加其他选项。

enter image description here

另外,如果您使用IntellijIDEA,则需要在服务器配置中添加JVM参数,如下所示。

enter image description here

答案 7 :(得分:1)

如果您使用带有tomcat的eclipse,请按照以下步骤进行操作

  1. 在服务器窗口上双击tomcat,它将打开tomcat的Overview窗口。

  2. 在概览窗口中,您会在常规信息下找到打开启动配置,然后点击打开启动配置

  3. 在编辑配置窗口中查找参数,然后单击它。
  4. 在参数标记中查找 VM参数
  5. 只需粘贴即可 -Xms256m -Xmx512m -XX:PermSize = 256m -XX:MaxPermSize = 512m 到参数的末尾。
  6. edit launch configuration properties

答案 8 :(得分: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

并查看输出中的新设置。这花了很长时间才进行诊断,我没有看到其他人提出这个建议,所以我想我会把它扔给互联网社区。

答案 9 :(得分:0)

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

使用grep检查进程后没有获取设置。 如果没有,请在catalina.sh中为JAVA_OPTS提供mem设置。

答案 10 :(得分:-5)

杀死tomcat进程(强制执行,为Linux杀死-9)并再次启动它解决了这个问题。我的猜测是,使用shutdown.bat不能正确杀死tomcat实例。所以,我们需要强行杀死进程并重新开始。