PermGen空间错误在tomcat

我在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 

我尝试在系统variables中添加JAVA_OPTS with the value as -Xms1024m -Xmx1024m ,但是我一次又一次地得到相同的错误(java.lang.OutOfMemoryError:PermGen空间) 。 任何帮助将不胜感激。 我也读过其他post在stackoverflow也没有解决。

PermGen空间是Tomcat用于存储类定义(仅限定义,不实例化)和已被实现的string池的内容。 从经验来看,PermGen空间问题往往在开发环境中经常发生,因为Tomcat每次部署WAR或执行jspc(编辑jsp文件时)都必须加载新类。 就我个人而言,当我在开发testing时,我倾向于部署和重新部署战争,所以我知道我必然迟早会用完(主要是因为Java的GC周期仍然有点废话,所以如果您快速频繁地重新部署战争足够的空间填满比他们能够pipe理更快)。

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

 -XX:MaxPermSize=SIZE 

但是我发现,最好的方法就是让class级卸载,让您的PermGen永远不会用完:

 -XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled 

这样的东西对我来说是过去的魔术。 有一件事情,在使用这些方面有一个显着的性能权衡,因为permgen扫描将使每个请求的额外的2个请求,或沿着这些线。 你需要平衡你的使用和权衡。

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

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

默认情况下,PermGen空间是64M(它包含所有编译的类,所以如果你的类path中有很多的jar(类),你可能确实填充这个空间)。

请注意,您可以使用JVisualVM监视PermGen空间的大小,甚至可以使用YourKit Java Profiler检查其内容

为了补充迈克尔的答案,根据这个答案 ,处理这个问题的一个安全的方法是使用以下参数:

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

如果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

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

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

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

在这里输入图像描述

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

在这里输入图像描述

@AndreSmiley的代码为我工作。

只需要修改是。

-XX:MaxPermSize = 256

“m”表示MB。

其实我的应用程序是有点巨大,所以我被build议做1024米的性能。

这一个为我工作,在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 

我在CentOS 6.6上运行tomcat7。 我试着创build一个新的/usr/share/tomcat/bin/setenv.sh文件并设置JAVA_OPTSCATALINA_OPTS 。 但是tomcat不会在重启时拿起这些值。 当我把下面一行放到/etc/tomcat/tomcat.conf中时:

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

tomcat拿起了新的环境variables。 我通过跑步validation了这一点

ps aux | grep tomcat

并在输出中看到新的设置。 这花了很长时间来诊断,我没有看到任何人提出这个build议,所以我想我会把它扔到互联网社区。

如果你用tomcat使用eclipse,按照下面的步骤

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

  2. 在“概述”窗口中,您可以在常规信息下find“ 打开启动configuration ”,然后单击“ 打开启动configuration

  3. 在编辑configuration窗口中查找参数并点击它。
  4. 在arguments标签中查找VM参数
  5. 只需将此-Xms256m -Xmx512m -XX:PermSize = 256m -XX:MaxPermSize = 512m粘贴到参数的末尾即可。

编辑启动配置属性

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