如何清除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_OPTS
和 CATALINA_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 空间使用情况
java.util.concurrent.ExecutionException:java.lang.OutOfMemoryError:tomcat 中的 PermGen 空间