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

标签 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

我尝试在系统变量中添加值为 -Xms1024m -Xmx1024m 的 JAVA_OPTS,但我仍然收到相同的错误 (java.lang.OutOfMemoryError: PermGen space)一次又一次。

任何帮助将不胜感激。我也阅读过 Stack Overflow 上的其他帖子,但没有成功。

最佳答案

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

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

-XX:MaxPermSize=SIZE

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

-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled

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

关于java - 如何清除tomcat中的PermGen空间错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10392255/

相关文章:

java - 发布类加载器时,什么时候对单例调用 finalize?

java - JAVA中字符串数组的定义

java - 更新 hibernate 中的多条记录的查询缓存

java.io.FileNotFoundException : C:\Program Files\Apache Software Foundation\Tomcat 8. 0\..\webapps\ROOT\_cipss\config.ini

maven - 如何将我自己的存档文件从 Jenkins 系统移动到 artifactory

java - 我有 JAXB 类加载器泄漏吗

grails - 使用CloudFoundry插件部署Grails应用

java - 当关闭相关(相同)entityManager 时,entityManager 先前找到或获取的实体怎么样?

java - 如何提高 Javafx Canvas 上线条的绘制速度

session - 在不将 jar 放入 CATALINA_HOME 目录的情况下创建自定义 tomcat session 管理器?