首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在tomcat中清除PermGen空间错误

如何在tomcat中清除PermGen空间错误
EN

Stack Overflow用户
提问于 2012-05-01 08:43:51
回答 11查看 111.7K关注 0票数 54

我在Windows环境中工作,每次使用tomcat时都会收到这个错误。

代码语言:javascript
复制
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 )

任何帮助都将不胜感激。我也读过其他关于Stack Overflow的帖子,但它也不起作用。

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2012-05-01 09:06:49

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

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

代码语言:javascript
复制
-XX:MaxPermSize=SIZE

然而,我发现解决这个问题的最好方法是允许卸载类,这样你的PermGen就永远不会用完:

代码语言:javascript
复制
-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled

像这样的东西在过去对我来说很神奇。但有一件事,在使用它们时会有很大的性能折衷,因为permgen清理会对你发出的每个请求或类似的东西产生额外的2个请求。你需要平衡你的使用和权衡。

票数 107
EN

Stack Overflow用户

发布于 2012-05-01 08:57:52

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

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

缺省情况下,PermGen空间是64M (并且它包含所有已编译的类,所以如果您的类路径中有很多jar (类),那么您确实可以填满这个空间)。

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

票数 17
EN

Stack Overflow用户

发布于 2013-10-29 18:10:39

根据this answer的说法,为了补充迈克尔的答案,处理这个问题的安全方法是使用以下论点:

代码语言:javascript
复制
-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled -XX:+UseConcMarkSweepGC
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10392255

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档