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

Posted

技术标签:

【中文标题】如何清除tomcat中的PermGen空间错误【英文标题】:How to clear PermGen space Error in tomcat 【发布时间】:2012-05-10 15:48:28 【问题描述】:

我在 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 的其他帖子,但没有成功。

【问题讨论】:

如果您使用“-Xnoclassgc”,请将其删除并尝试 【参考方案1】:

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

在使用 grep 检查进程后,它没有选择设置。 如果没有,请改为在 catalina.sh 中提供 JAVA_OPTS 的 mem 设置。

【讨论】:

【参考方案2】:

如果你使用 eclipse 和 tomcat,请按照以下步骤操作

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

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

    在编辑配置窗口中查找 Arguments 并单击它。 在参数标签中查找 VM 参数。 只需粘贴这个 -Xms256m -Xmx512m -XX:PermSize=256m -XX:MaxPermSize=512m 到参数的末尾。

【讨论】:

【参考方案3】:

@AndreSmiley 的行代码对我有用。

唯一需要修改的是。

-XX:MaxPermSize=256m

“m”表示 MB。

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

【讨论】:

【参考方案4】:

我在 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 辅助 | grep tomcat

并在输出中看到新设置。这需要很长时间才能诊断出来,而且我没有看到其他人提出这个建议,所以我想我会把它扔给互联网社区。​​p>

【讨论】:

【参考方案5】:

在 Tomcat 7.0 Windows Service Installer 版本中。 /bin 中没有 catalina.bat。 所以你需要在 /bin 中打开 Tomcat7w.exe 并添加打击 JVM 参数

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

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

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

【讨论】:

【参考方案6】:

这对我有用,在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

【讨论】:

【参考方案7】:

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

【讨论】:

【参考方案8】:

杀死 tomcat 进程(对于 Linux,强制杀死 -9)并重新启动它可以解决问题。我的猜测是,tomcat 实例没有被shutdown.bat 正确杀死。所以,我们需要强行终止进程并重新开始。

【讨论】:

杀死进程并不能在他下次使用它时解决问题。【参考方案9】:

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

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

【讨论】:

Tomcat 7.0.47 显示一条警告,指出将 'CMSPermGenSweepingEnabled' 替换为 'CMSClassUnloadingEnabled'【参考方案10】:

PermGen 空间是 Tomcat 用来存储类定义(只有定义,没有实例化)和已被实习的字符串池的地方。根据经验,PermGen 空间问题往往在开发环境中经常发生,因为 Tomcat 必须在每次部署 WAR 或执行 jspc(当您编辑 jsp 文件时)时加载新类。就个人而言,我在进行开发测试时倾向于部署和重新部署战争,所以我知道我迟早会用完(主要是因为 Java 的 GC 周期仍然有点垃圾,所以如果你快速频繁地重新部署你的战争够了,空间填满的速度比他们能管理的要快)。

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

-XX:MaxPermSize=SIZE

然而我发现最好的办法就是让类被卸载,这样你的 PermGen 就永远不会用完:

-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled

过去,类似的事情对我来说很神奇。有一件事,在使用这些时有一个显着的性能权衡,因为 permgen 扫描会为你提出的每个请求或类似的东西额外发出 2 个请求。您需要在使用与权衡之间取得平衡。

【讨论】:

感谢您的评论,所以根据您的说法,我应该将这些内容添加为 JAVA_OPTS -XX:MaxPermSize=128M -XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled 的值 @AKIWEB 这解决了您的问题吗?你把这些行放在哪里,在 setenv.sh 中? 要使CMSPermGenSweepingEnabled 产生任何影响,必须设置UseConcMarkSweepGC。 ***.com/questions/3334911/… 我在哪里添加这个 在哪里添加我在 CATALINA_OPTS=-Djava.awt.headless=true -Xms2048m -Xmx4096m -XX:PermSize=1024m -XX:MaxPermSize=2048m -XX:+CMSClassUnloadingEnabled -XX 中添加的值: +CMSPermGenSweepingEnabled 并在 Eclipse Tomcat 配置文件的环境中添加,但错误仍然存​​在【参考方案11】:

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

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

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

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

【讨论】:

感谢您的评论,所以根据您的说法,我应该将这些内容添加为 JAVA_OPTS -XX:MaxPermSize=128M -XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled的值

以上是关于如何清除tomcat中的PermGen空间错误的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Tomcat 中部署之前监控 PermGen 空间使用情况

Jenkins 中的 PermGen 错误

java.util.concurrent.ExecutionException:java.lang.OutOfMemoryError:tomcat 中的 PermGen 空间

用tomcat PermGen空间做啥

增加基于 Windows 安装程序的 Tomcat PermGen 空间

Tomcat PermGen 上的 Spring MVC 空间不断增加